2010-08-31 1369 views

回答

20

其实这是相反的。

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

这样算下来DateTime.Now.ToUniversalTime()是一样的UtcNow.ToLocalTime()。ToUniversalTime() – Anthony 2010-08-31 08:41:05

+0

@Anthony都没有,看到我的回答(有点晚) – 2017-02-02 10:32:13

0

我觉得用DateTime.UTCNow会考虑为UTC的DateTime.Kind属性的值,而与ToUniversalTime可以提供Kind属性与当地DateTime对象:为Now属性来实现。

1

那么,实际执行(你可以看到它在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); 
+0

如果你看一下'ToLocalTime实施'你会发现'Now'的当前实现大多只是一个手动内联和简化的'return UtcNow.ToLocalTime();'版本。 – Guffa 2017-02-10 16:30:26

0

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

相关问题