Подтвердить что ты не робот

В чем разница между DateTime.UtcNow и DateTime.Now.ToUniversalTime()

Для меня они одинаковые. Является ли UtcNow просто ярлыком?

4b9b3361

Ответ 1

На самом деле все наоборот. Свойство Now реализовано как:

public static DateTime Now {
  get {
    return UtcNow.ToLocalTime();
  }
}

Ответ 3

Ну, фактическая реализация (вы можете увидеть ее на referencesource):

public static DateTime Now {
    get {
        Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Local);

        DateTime utc = UtcNow; 
        Boolean isAmbiguousLocalDst = false;
        Int64 offset = TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(utc, out isAmbiguousLocalDst).Ticks;
        long tick = utc.Ticks + offset;
        if (tick>DateTime.MaxTicks) {
            return new DateTime(DateTime.MaxTicks, DateTimeKind.Local);
        }
        if (tick<DateTime.MinTicks) {
            return new DateTime(DateTime.MinTicks, DateTimeKind.Local);
        }
        return new DateTime(tick, DateTimeKind.Local, isAmbiguousLocalDst);  
    }
}

ToUniversalTime() вызывает TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime)

а UtcNow:

long ticks = 0;
ticks = GetSystemTimeAsFileTime();
return new DateTime( ((UInt64)(ticks + FileTimeOffset)) | KindUtc);

Ответ 4

Я думаю, что использование DateTime.UTCNow будет рассматривать значение свойства DateTime.Kind как UTC, тогда как с ToUniversalTime вы можете предоставить свойство Kind локальному объекту datetime.

Ответ 5

Это не ярлык, DateTime.Now использует DateTime.UtcNow внутри, а затем применяет локализацию. Короче говоря, используйте ToUniversalTime(), если у вас уже есть DateTime.Now и нужно преобразовать его в UTC, используйте DateTime.UtcNow, если вы просто хотите получить текущее время в формате UTC.