DateTimeOffset.UtcNow.DateTime是否等效于DateTime.UtcNow?

And*_*nea 10 .net c# datetime type-conversion datetimeoffset

我需要将一些代码从静态调用升级DateTime.UtcNow到调用基本上返回的时间提供程序服务DateTimeOffset.UtcNow.要进一步转换此DateTimeOffset实例DateTime,有DateTime属性.另外,似乎有从隐式转换DateTimeOffsetDateTime.

我有点担心可能会出现一些我现在看不到的边缘情况,而这两种情况并不相同.在那儿?

Mik*_*ray 7

如果你看看你的价值,DateTimeOffset.UtcNow.DateTime.Kind你会看到它是未指定的.框架将未指定的种类视为本地时间.这种类型DateTime.UtcNow是Utc,因此当时区转换应用于本地时区时会有所不同.

解决方法是使用DateTimeOffset.UtcNow.UtcDateTime具有指定的Utc类型的.

  • DateTimeOffset.UtcNow 不是 UTC?为什么财产的命名如此混乱? (8认同)

Mat*_*ttC 4

内部看起来像这样:

  public static DateTimeOffset UtcNow {
        get { 
            return new DateTimeOffset(DateTime.UtcNow);
        } 
  } 

  public DateTime DateTime { 
        get {
            return ClockDateTime;
        }
    } 
   private DateTime ClockDateTime { 
        get {
            return new DateTime((m_dateTime + Offset).Ticks, DateTimeKind.Unspecified); 
        }
    }

  public DateTime UtcDateTime { 
        [Pure] 
        get {
            Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Utc); 
            return DateTime.SpecifyKind(m_dateTime, DateTimeKind.Utc);
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,看起来您最终可能会得到一个基于 UTC 的 DateTime,但随后会转换为Unspecified.