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

时间:2015-11-11 16:34:37

标签: c# .net datetime type-conversion datetimeoffset

我需要将一段代码从静态调用DateTime.UtcNow升级到调用时间提供程序服务,该服务基本上返回DateTimeOffset.UtcNow。要将此DateTimeOffset实例进一步转换为DateTime,请使用DateTime属性。或者,似乎存在从DateTimeOffsetDateTime的隐式转换。

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

3 个答案:

答案 0 :(得分:5)

如果查看DateTimeOffset.UtcNow.DateTime.Kind的值,您会看到它未指定。框架将未指定的种类视为本地时间。 DateTime.UtcNow的种类是Utc,因此在本地时区应用时区转换时会有差异。

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

答案 1 :(得分:4)

在内部看起来像这样:

<template id="cardSetFoo" is="dom-bind">
  <template id="cardSet" is="dom-repeat" items="[[data]]" as="card">
    <paper-card>
      <div class="card-body">
        <h4>[[card.title]]</h4>
        [[card.text]]
      </div>
    </paper-card>
  </template>
</template>

所以看起来你最终得到一个基于UTC的DateTime,然后转换为 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); } }

答案 2 :(得分:1)

来自the .NET reference source

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

所以,是的,看起来它等同于DateTime.UtcNow