我应该如何在不同时区存储事件数据?

时间:2014-02-27 07:36:16

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

这是一个概念性问题,所以这里没有代码片段。

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

Everything 应该以UTC格式存储,以便有一致的比较和计算基础。然后,只有当某人参与其中时,才应将其转换为当地时间。

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

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

而且,除非你有一个真实的,迫切的需要(例如)在孟买告诉某人当纽约事件发生(或将要发生)时纽约的当地时间,你不需要存储时区为了这个活动。如果你有这样的需要(a),那么一定要存储时区,这样你就可以得到你所在的当地时间和活动的当地时间是/是


(a) CJBS在下面的评论中指出了一些很好的例子,例如:

  • 一个航班,了解到达目的地的当地时间是有用的,这样可以在那里订购出租车;或
  • 在活动中与人们安排在某个时间见面。

答案 1 :(得分:1)

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

但是,如果您要求安排将来发生的事件,特别是如果它是一个重复发生的事件,那么UTC就不够了。我已经多次写过这篇文章了,所以我建议你阅读这些文章了解详情: