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

时间:2010-08-31 08:29:01

标签: c#

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

5 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

嗯,实际的实现是(你可以在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);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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