这是一个重要且令人惊讶的棘手问题。事实是,持久性没有完全令人满意的标准。例如,SQL标准和ISO格式(ISO 8601)显然不够。
从概念的角度来看,一种通常处理两种类型的时间日期数据,并且将它们区分开是很方便的(上述标准没有):“ 物理时间 ”和“ 民事时间 ”。
时间的“物理”时刻是物理处理的连续通用时间线中的一个点(当然,忽略相对论)。例如,此概念可以在UTC中进行适当的编码持久化(如果您可以忽略leap秒)。
“民事”时间是遵循民事规范的日期时间规范:此处的时间点由一组日期时间字段(Y,M,D,H,MM,S,FS)加上TZ(时区规范)完全指定(实际上,这也是一个“日历”;但假设我们将讨论范围限制为公历)。时区和日历共同(原则上)允许从一种表示映射到另一种表示。但是民用和物理时刻在根本上是不同的量值类型,应该在概念上将它们分开并进行不同的处理(比喻:字节和字符串数组)。
这个问题令人困惑,因为我们可以互换地谈论这些类型的事件,并且因为平民时代可能会发生政治变化。对于将来的事件,问题(以及区分这些概念的需求)变得更加明显。示例(摘自我在这里的讨论。
John在他的日历中记录了日期时间2019-Jul-27, 10:30:00
TZ =的某个事件的提醒
Chile/Santiago
(该事件具有GMT-4偏移,因此对应于UTC 2019-Jul-27 14:30:00
)。但是在将来的某一天,该国决定将TZ偏移量更改为GMT-5。
现在,当一天到来时...该提醒是否应在
A)2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
要么
B)2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
没有正确的答案,除非有人知道约翰在告诉日历“请给我打电话”时的概念2019-Jul-27, 10:30:00
TZ=Chile/Santiago
。
他的意思是“民用日期时间”(“我城市的时钟说10:30时”)吗?在这种情况下,A)是正确的答案。
还是他的意思是“物理时刻”,即我们宇宙连续时间线中的一个点,例如,“下一次日食发生时”。在这种情况下,答案B)是正确的答案。
一些Date / Time API可以正确地实现这种区分:其中有Jodatime,它是下一个(第三个!)Java DateTime API(JSR 310)的基础。
GETDATE()
在SQL上的方式将是UTC(以及DateTime.Now
)。而且,服务器不会受到任何自动DST更改的影响。