DateTime.UtcNow和DateTime.Now.ToUniversalTime()之间有什么区别

对我来说,他们都是一样的。 UtcNow只是一条捷径吗?

实际上它是另一种方式。 Now属性实现为:

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

UtcNow的文档中有一个很长的例子,它表明它们是相同的。

那么,实际的实现是(你可以在referencesource上看到它):

 public static DateTime Now { get { Contract.Ensures(Contract.Result().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 

ToUniversalTime()调用TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime)

而UtcNow只是:

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

我认为使用DateTime.UTCNow会将DateTime.Kind属性的值视为UTC,而使用ToUniversalTime,您可以为Kind属性提供本地日期时间对象。

它不是快捷方式,DateTime.Now在内部使用DateTime.UtcNow然后应用本地化。 简而言之,如果您已经拥有DateTime.Now并需要将其转换为UTC,请使用ToUniversalTime(),如果您只想以UTC格式检索当前时间,请使用DateTime.UtcNow。