Why SystemClock.UtcNow.Milliseconds is always 0

Viewed 49

I inject ISystemClock to my service:

public class EventSink
{
    private readonly ISystemClock _systemClock;

    public EventSink(ISystemClock systemClock)
    {
        _systemClock = systemClock;
    }

    private async Task SaveEvent(CancellationToken ct)
    {
        var event = new MyEvent
        {
            Timestamp = _systemClock.UtcNow.DateTime
        };
    }
}

it is simply registered on startup:

services.AddScoped<ISystemClock, SystemClock>();

but the DateTime milliseconds property is always 0.

Also this new SystemClock().UtcNow.Millisecond returns always 0.

Examples from Immediate Window:

DateTime.UtcNow.Millisecond
786
new SystemClock().UtcNow.Millisecond
0
System.DateTimeOffset.UtcNow.Millisecond;
265

enter image description here

1 Answers

Found the answer, this is source code of SystemClock:

        public DateTimeOffset UtcNow
    {
        get
        {
            // the clock measures whole seconds only, to have integral expires_in results, and
            // because milliseconds do not round-trip serialization formats
            var utcNowPrecisionSeconds = new DateTime((DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond, DateTimeKind.Utc);
            return new DateTimeOffset(utcNowPrecisionSeconds);
        }
    }
Related