存储时间信息:需要时区?

dud*_*wad 6 php mysql timezone timestamp

我很想知道我正在考虑的是不好的做法,或者如果因为这是一个特定而慎重的选择,那实际上是一个不错的主意.我想存储特定城市中发生的事件的日期信息.我想将这些数据存储为UTC时间戳.简单地存储时间戳和城市ID /国家ID(与特定时区相关联)而不是存储每个事件的时区不是一个好主意吗?我问,因为时区可以改变,但城市ID在数据库中永远不会改变.一旦服务器在时区更改的(不太可能的)事件中与最新时区同步,该事件将是独立的并且不受该更改的影响.但是,假设时区改变了它的边界,那么之前在该时区发生的事件可能在它之外.这样做似乎不明智吗?我只是想知道,我一直在寻求最佳实践,但在这种情况下,这实际上似乎是一个好主意.这特别是因为应用程序设计模型永远不会改变 - 事件将始终与特定城市相关联.

基本流程将是:

  • 具有日期/位置的事件数据以ISO-8601 YYYY-MM-DD字符串等标准格式进入系统.

  • 系统将日期转换为UTC时间戳,并使用该时间戳和事件的城市ID将日期与事件一起存储.

  • 当用户请求查看该事件时,系统会提取与该事件关联的时间戳和城市信息,并使用城市的时区在显示时相应地格式化日期.

这是一个糟糕的主意吗?这有什么好处,存储TZ Offset的概念是否同样可以消除这个问题?

Mat*_*int 7

安排未来的时间本质上是困难的,因为你不知道未来会发生什么变化。这与记录过去的时间完全不同。

对于过去的时间事件,您真正需要的是本地日期和时间,以及与 UTC 的偏移量(许多平台将其称为“DateTimeOffset”)。

但对于未来的事件,您不一定知道偏移量是多少。您可以根据您当前对时区信息的了解来猜测它是什么,但该信息可能会发生变化。事实上,随着世界各国政府对夏令时和其他情况的改变,它每年都会发生多次变化。

由于您无法可靠地确定偏移量,因此您也无法确定准确的 UTC 时间戳。因此,保留原始当地时间非常重要。如果您要计算 UTC 时间戳,则还应该在每次更新时区数据时重新计算。

我已经多次写过这个问题(这里这里这里)。我建议你阅读这些帖子。

现在你提出了我以前没有提到的一点,否则我会把你的问题标记为重复。也就是说,如果事件地点完全因为时区边界发生变化而转移到新的时区,该怎么办?

我同意 Deceze 的观点,你需要考虑这种情况的可能性有多大以及失败的后果有多么严重。在我看来,这可能不值得投入大量时间。如果您将来安排了一项活动,并且该地点发生了新的时区,您可以随时返回并编辑该活动。您需要问自己您的应用程序需要了解多少有关时区更改的详细信息。我使用过的大多数调度系统都不处理这方面的问题。

如果你确实想处理这件事,那么你需要的不仅仅是城市。您应该存储该位置的纬度和经度坐标。然后,您可以使用其中一种方法从这些坐标解析时区。但还要注意,您需要确保时区边界的来源尽可能是最新的。

另请注意,IANA 时区数据库是时区数据的原始来源,根本不保留边界数据!大多数边界数据来自独立来源,例如Eric Muller 的 shapefiles,截至今天与 IANA 数据库的 2013b 数据(即 2013i)一致,因此时区数据至少有 7 次更新要么没有改变任何边界,要么没有跟踪更改。


dec*_*eze 4

无论您采用哪种方式,都会根据变化情况以不同的方式失败。

  1. 如果您将时间戳存储在相应的时区中2013-12-29 12:34:56 America/New_York,那么如果布朗克斯突然开始自己的时区,这将会失败America/New_York_Bronx with a different offset and your event happened to be in the Bronx.

    确定这种情况的可能性有多大以及失败的严重程度。

  2. 如果您以 UTC 格式存储时间戳,并且事件发生所在的时区正在重新定义其偏移量(例如,移动 DST 日期,或完全偏移至不同的偏移量),则事件时间可能与该位置的实际挂钟时间不同。如果您2013-12-29 12:34:56 UTC在德国柏林准备 13:34:56 举行的活动,而柏林的夏令时发生了变化,2013-12-29 12:34:56 UTC may now correspond to 14:34:56 Berlin local time, while the event is still actually happening at 13:34 local time.

    确定这种情况的可能性有多大以及失败的严重程度。

  3. 如果您存储 UTC 时间戳并将其链接到物理位置,然后将其链接到时区,则可以解决这两个问题。但为此,您必须存储精确的物理位置,而不仅仅是“纽约”,否则您只会遇到情况 1. 以及一个中间步骤。如果您确实存储了精确的物理位置,并且有一种精确的方法将该位置解析为时区,并且使时区数据库保持最新,那么您几乎可以处理所有更改情况。

    确定它的实用性以及这种额外的精度对您的价值有多大。