【问题标题】:Is DateTimeOffset.UtcNow.DateTime equivalent to DateTime.UtcNow?DateTimeOffset.UtcNow.DateTime 是否等同于 DateTime.UtcNow?
【发布时间】:2016-02-12 19:45:00
【问题描述】:

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

我有点担心可能存在一些我现在看不到的边缘情况,这两个情况并不相同。有吗?

【问题讨论】:

  • "要进一步将此 DateTimeOffset 实例转换为 DateTime,有 DateTime 属性" - 还有 UtcDateTime 属性,这似乎更适合您的场景

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


【解决方案1】:

内部是这样的:

  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);
        }
    }

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

【讨论】:

  • 在这种情况下,对结果调用DateTime.SpecifyKind 应该足以使其与DateTime.UtcNow 完全相同,对吧?
  • 这似乎是正确的,但这不会使它成为第三个要创建的 DateTime 对象吗? UTCNow、ClockDateTime 然后最后那种调整了。如果 OP 很乐意转换,那么可以。如果是一些现有代码依赖于它们是 100% 等效的,那么可能会有问题。
  • 我可以在DateTimeOffset 实例上使用.UtcDateTime 而不是.DateTime 属性吗?像这样:DateTimeOffset.UtcNow.UtcDateTime
  • DateTime 是一种值类型,不涉及任何对象创建(至少不是我认为的那样)。
【解决方案2】:

来自the .NET reference source

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

所以,是的,它看起来相当于DateTime.UtcNow

【讨论】:

  • 它似乎稍后会被进一步破坏,所以我认为你是对的,它们可能具有相同的值,但不确定 DateTimeKind 设置。
【解决方案3】:

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

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

【讨论】:

  • DateTimeOffset.UtcNow 不是 UTC?为什么财产的命名如此混乱?
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 2010-11-30
  • 2017-01-20
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多