DateTime.Now.Ticks
的值不应该和DateTime.UtcNow.Ticks
一样吗?我检查了它们的值,发现差异代表我当前时区与 UTC 的偏移量。我在这里错过了什么?
这是对象设计方式的一部分。
在其他库和语言(例如,JavaScript 的 Date
类型)中,该值绑定到 UTC,并且通常使用 1970-01-01 纪元。
但在 .NET 中,Ticks
值与 Years
、Months
、Days
和其他属性所基于的同一引用框架相关。 它使用纪元 0001-01-01。
在DateTime
中,有一个名为Kind
的属性:
- 如果种类为
DateTimeKind.Utc
,则您知道该值与 UTC 相关。 - 如果类型为
DateTimeKind.Local
,则您知道该值与本地时区相关。 - 如果类型是
DateTimeKind.Unspecified
,那么您不知道您拥有什么时区参考。 你只有一个日期和时间。
您将DateTime.UtcNow.Ticks
和DateTime.Now.Ticks
之间的差异视为当前时区偏移量,因为DateTime.Now
具有Local
类型,而DateTime.UtcNow
具有Utc
类型。 因此,DateTime.Now
的刻度基于您当地的时区,而DateTime.UtcNow
的刻度则基于 UTC。
DateTimeOffset
类型可用于解决此问题。 Ticks
仍然是相对于显示的值,但Offset
可用于始终将这些刻度调整回 UTC 参考框架。
如果你不喜欢这样,就像许多人不喜欢的那样,另一种方法是使用 Noda 时间库中的类型。
顺便说一下,我更详细地介绍了这些信息,并将其与我的Pluralsight课程"日期和时间基础"中的其他编程语言进行了比较。
这是不同的,因为时区不同。