我知道,与 DateTime 相比,引用单个时间点 DateTimeOffset 是更好、更可靠的方法,因为它用一个更方便的东西替换 .Kind 属性,即 Offset to UTC。
这是否解决了有关在日期时间中存储单个点的所有问题,或者仍然存在一些我应该关注的情况? (如果有你能给我一些 DateTimeOffset 不可靠的例子吗?)
谢谢
我知道,与 DateTime 相比,引用单个时间点 DateTimeOffset 是更好、更可靠的方法,因为它用一个更方便的东西替换 .Kind 属性,即 Offset to UTC。
这是否解决了有关在日期时间中存储单个点的所有问题,或者仍然存在一些我应该关注的情况? (如果有你能给我一些 DateTimeOffset 不可靠的例子吗?)
谢谢
给定 a DateTimeOffset
,永远不会混淆它代表什么时间点。所以他们总是可靠的。
但是在某些情况下,DateTimeOffset
单独使用 a 仍然不够。这是一个常见情况的示例:
DateTimeOffset
带有值的2013-03-10T01:00:00-05:00
。2013-03-10T03:00:00-05:00
.2013-03-10T03:00:00-04:00
。要克服这种情况,您还必须知道时间是在纽约记录的。你在第一步就知道了,但是当你记录它时,它就被扔掉了。在您的应用程序的其他地方,您必须坚持这一事实。最好保留一个时区 ID,以便重新计算正确的偏移量。
如果TimeZoneInfo
在您的应用程序中使用该类,那么您可能希望跟踪该.Id
属性的值,以及您的DateTimeOffset
. 对于纽约,时区 ID 为"Eastern Standard Time"
. 这有点令人困惑,因为无论 DST 是否生效,都会使用相同的值。(没有带有Id
of 的Windows 时区"Eastern Daylight Time"
)。TimeZoneInfo
此外,没有将 a与 a配对的内置类或结构DateTimeOffset
。你必须自己做。
如果您使用的是Noda Time(我强烈推荐)。然后,您可以利用 IANA 时区 id"America/New_York"
和ZonedDateTime
对象 - 专为这种确切情况而设计。
您还应该参考DateTime 与 DateTimeOffset。您应该会发现那里的类比非常有用。
也有一些DateTimeOffset
不合适的情况。也许这一点很明显,但仍然值得一提。
这种情况发生的频率比你想象的要多。例如:
还有其他现实世界的例子,日历上的同一点不是同一时间点,但人们倾向于认为它们好像是同一时间点。
在 Noda Time 中,您可以将 aLocalDateTime
用于这些场景。如果没有 Noda Time,您将使用DateTime
with .Kind == Unspecified
。