【问题标题】:How should I store data for events in different timezones?我应该如何存储不同时区的事件数据?
【发布时间】:2014-03-30 11:56:43
【问题描述】:

这是一个概念问题,所以这里没有代码 sn-ps。

假设我创建了一个事件数据库。其中一些在纽约,一些在芝加哥,一些在凤凰城,等等......

我的服务器时区设置为纽约。

在我看来,为所有这些事件创建 UNIX 时间戳时,我有两个选择。

  1. 考虑时区。 (即,1 月 1 日午夜在芝加哥和凤凰城发生的事件将具有不同的时间戳)。然后,每当我想以文本格式显示日期时,我都必须再次考虑时区。

  2. 假装所有事件都发生在纽约,以此来伪造它。 1 月 1 日午夜在芝加哥和凤凰城发生的事件将具有相同的时间戳。由于我的服务器设置为纽约,因此我不必为每个事件考虑时区。

哪种方法更好?方法 1 给出了更“真实”的时间戳,但方法 2 似乎不那么复杂,但仍然给出了相同的结果。

【问题讨论】:

    标签: datetime data-structures timezone timestamp unix-timestamp


    【解决方案1】:

    一切都应该以 UTC 格式存储,以便有一个一致的基础进行比较和计算。只有当有人参与时才应将其转换为当地时间。

    使用 UTC 将大大简化您的代码,因为您不必在每个日期/时间都携带时区并跨许多不同的区域执行复杂的计算 - 我们在一个项目中做过一次在我再次这样做之前我会退出 :-)

    换句话说,如果用户输入纽约时间,请尽快将其转换为 UTC。向用户显示日期/时间时,请尽可能晚地将其改回本地时间。

    而且,除非您有真正迫切的需要(例如)告诉孟买的某人纽约事件发生(或将要发生)时的纽约当地时间,否则您不需要存储时区为事件。如果您确实有这样的需求(a),请务必同时存储时区,这样您就可以获得您所在的本地时间和事件所在的本地时间是/曾经。


    (a) CJBS 在下面的 cmets 中指出了几个很好的例子,例如:

    • 了解到达目的地的当地时间以便在那里预订出租车很有用的航班;或
    • 安排参加活动的人在特定时间见面。

    【讨论】:

    • 连同时区/UTC 偏移量
    • @CJBS,如果您需要事件的时区,您可以这样做。我从来没有发现它有必要,因为人们通常想知道什么时候发生了基于他们的时区。但值得一提,所以我会的。
    • 公平点。这个问题是概念性的,并且与事件有关,因此/可能/需要记录事件的时区,以便以本地时区格式(事件的,而不是最终用户的)显示。只是一个考虑。例如,考虑一次航班,了解到达目的地的当地时间是很有用的,这样可以在那里预订出租车。这同样适用于活动(安排参加活动的人在活动所在时区的某个时间见面,无论一个人现在在哪里)。
    【解决方案2】:

    如果您的意思是记录事件发生的时间,或者记录过去事件的时间,那么 paxdiablo 的答案是正确的。通常,UTC 就足够了。在少数情况下,您可能希望存储本地日期时间 + 偏移量(在某些平台上为“DateTimeOffset”),但这取决于您使用数据的目的。

    但是,如果您询问安排将来会发生的事件,特别是如果它是重复性事件,那么 UTC 并不完全足够。我已经写过好几次了,所以我建议你阅读这些文章以了解详细信息:

    【讨论】:

    • 你的回答比@paxdiablo 更适合我的情况,因为我正在处理未来的事件。我没有想过如何处理未来时区边界的变化。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2012-06-20
    • 2017-02-26
    • 2018-02-03
    • 2017-02-01
    • 2018-09-22
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多