DateTime.Ticks 属性 值

DateTime.Ticks property value

DateTime.Now.Ticks的值不应该和DateTime.UtcNow.Ticks一样吗?我检查了它们的值,发现差异代表我当前的时区与 UTC 的偏移量。我在这里错过了什么?

因为时区不同所以不一样

这是对象设计方式的一部分。

在其他库和语言中(例如,JavaScript 的 Date 类型),该值绑定到 UTC,通常使用 1970-01-01 的纪元。

但在 .NET 中,Ticks 值与 YearsMonthsDays 和其他属性所基于的相同参考系相关在。它使用 0001-01-01 的纪元。

DateTime 中,有一个 属性 叫做 Kind:

  • 如果 kind 是 DateTimeKind.Utc,那么你知道这个值与 UTC 相关。
  • 如果种类是DateTimeKind.Local,那么你就知道这个值与当地时区有关。
  • 如果类型是 DateTimeKind.Unspecified,那么您不知道您拥有的是哪个时区参考。您只需要一个日期和时间。

您看到 DateTime.UtcNow.TicksDateTime.Now.Ticks 之间的差异作为您当前的时区偏移量,因为 DateTime.NowLocal 种类,而 DateTime.UtcNowUtc亲切。因此 DateTime.Now 的报价基于您当地的时区,而 DateTime.UtcNow 的报价基于 UTC。

DateTimeOffset类型可以用来解决这个问题。 Ticks 仍然相对于显示的值,但 Offset 可用于始终将这些刻度调整回 UTC 参考系。

如果您不喜欢这个(很多人不喜欢),另一种方法是使用 Noda Time 库中的类型。

顺便说一句,我更详细地介绍了这些信息,并将其与我的 Pluralsight 课程 Date and Time Fundamentals 中的其他编程语言进行了比较。