Для меня они одинаковые. Является ли UtcNow просто ярлыком?
В чем разница между DateTime.UtcNow и DateTime.Now.ToUniversalTime()
Ответ 1
На самом деле все наоборот. Свойство Now
реализовано как:
public static DateTime Now {
get {
return UtcNow.ToLocalTime();
}
}
Ответ 2
В Documentation for UtcNow есть длинный пример, который показывает, что они одинаковые.
Ответ 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.