“DateTime”和“DateTimeOffset”的区别

50

DateTimeDateTimeOffset对象有什么区别?

我们应该在什么情况下使用每个对象呢?

在可能更改服务器所在地区的Web应用程序中,存储日期和时间。哪一个更好,或者是否有其他建议?


1
请参阅此答案 - Matt Johnson-Pint
2个回答

31

DateTimeOffset是一个表示时间点的结构体,通常表示为相对于协调世界时(UTC)的日期和时间,它比DateTime结构提供更高程度的时区意识。请点击此处查看详细信息。


15
非常感谢。有帮助:D 我不明白为什么有些人会对我的简单问题投反对票!!! 我是新手,应该学习更多,也应该问我的问题! - amiry jd
1
它唯一具备的“时区意识”是存储特定时间点的UTC偏移量。它没有其他关于时区的知识,包括创建该值的时区,因此它唯一真正的用途是处理历史数据。对于其他任何事情来说,它都是相当无用的。 - Suncat2000
1
@Suncat2000,这个偏移量使得一切都不同了!(它带来了“时区意识”)。当你拍照时,相机会为其分配本地时间(比如“DateTime”)。如果它保存的等价于“DateTimeOffset”,那么在旅行或跨越夏令时变化时,你就不会遇到“我是在9:00还是10:00拍的这张照片”的问题。一个错误的架构决策给所有关心时间的摄影师带来了问题。同样的情况也适用于IT系统中的所有DateTime字段。 - Andrzej Martyna
@AndrzejMartyna 这不是时区意识,只是与UTC的偏移量,几乎没有提供任何有用信息。你无法可靠地从中确定任何关于时区的信息,除了datetime值在创建时来自某个时区。毫无价值。要么严格遵循UTC并避免混淆,要么将其与时区标识符一起存储,以便可以执行有意义的转换。DATETIMEOFFSET 毫无用处。 - Suncat2000
@Suncat2000,我有点同意。我认为这完全取决于开发人员遵守项目中设置的规则。如果您使用DateTime,则会受到开发人员当前心情的影响。 DateTimeOffset 要难以欺骗一些。解决方案可以是实现您的类并完全停止使用 DateTime(正如您建议始终使用两个字段-顺便问一下,您是否经常看到这种方法?;) 。 - Andrzej Martyna

22

DateTimeOffset能够克服DateTime的缺点。它表示相对于协调世界时(UTC)的日期和时间。例如:

如果没有一个参考点,给定的日期和时间 "4/18/2013 11:00:00 AM" 没有任何意义。这可能是世界上任何地方的上午11:00:00。DateTimeOffset包含有关您正在处理的时区的信息,这在世界上都非常重要!

要了解更多详细信息,请必读一次


1
唯一的区别是它仅存储DateTime表示的特定时间点的UTC偏移量。它不存储实际的时区,因此基本上你只能在相对本地时间和UTC之间进行转换。在某些情况下很有用,但信息相对较弱。DateTimeOffset不是一个具备时区感知能力的DateTime类。 - Suncat2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接