【问题标题】:How to handle new time zone?如何处理新时区?
【发布时间】:2016-02-29 20:34:28
【问题描述】:

我们有一个城市数据库及其地理坐标。一旦我们使用tzworld 填充了相应的时区。用户设置位置,包括城市,城市有时区——这里我们如何知道用户的时区(我们需要在服务器上呈现日期和时间)。但是时区正在改变:一些新的出现,一些旧的正在被删除。

是否有任何最佳做法或工具来处理此类更改?

即有一个城市Foo,时区为Foo/Bar。一天 tzdata 发生了变化,Foo/Bar 被分割成 Foo/Old_BarFoo/New_Bar 时区,具有相同的 UTC 偏移量。我们的数据库中仍然有Foo/Bar。实际上,这是一个 BC 中断,但没关系,因为,比如说,我们可以处理那些 BC 中断。但随后 tzdata 再次更改,现在 Foo/New_Bar 具有不同的偏移量。麻烦来了。从那一刻起,来自Foo city 的一些用户看到了错误的当地时间。

只是为了确保您正确理解我的意思:这与 DST 无关,而是关于时区(它们的名称)正在更改的事实

据我所知,我们需要一种机器可读的 tzdata diff。喜欢

split: Foo/Bar Foo/Old_Bar,Foo/New_Bar
move:  Foo/New_Bar -05:00

这个问题让我觉得存储时区是个坏主意。有没有更好的?

【问题讨论】:

  • 好的日期库不是已经这样做了吗? (跟踪时区变化等)你能举一个具体的例子,Foo/New_Bar 在同一日期可以有两个不同的偏移量吗?这是您遇到的现实问题吗? (我并不是说它不是——我只是很难想象它可能适用于哪里)
  • @Pekka웃 到目前为止,这不是一个现实世界的问题(主要是因为我们的大多数用户来自具有稳定时区的地区),但它很容易做到。我不小心注意到一些时区消失了,一些时区出现在最近的 tzdata 更新之后。我想要一个强大的解决方案,而这个可能的问题,尤其是缺乏相关信息一直困扰着我。
  • 但是你真的有一个用例可能会出现问题吗?如果您有日期和时间,那么您的图书馆应该能够将其解析到一个时间点(并且它应该能够处理crazy edge cases; 开发人员spend a lot of time 确保他们这样做)。如果区域消失或添加,库应该有这些更改的列表。这真的是您需要在应用程序中处理的事情吗?
  • @Pekka웃 查看 Matt Johnson 出色而详尽的回答,它可以帮助您理解问题,我不会说得更好。

标签: datetime time timezone


【解决方案1】:

对于 IANA/Olson TZ 数据库,位置标识符一旦建立就不会改变。对于那个位置,每个标识符的历史总是一致的

但是,如果您使用 tz_world 或其他地图源来确定某个 other 位置的时区 - 不一定有它自己的 标识符,那么是的 - 区域拆分可能会导致区域发生变化。但是,当它这样做时,新区域应该与旧区域保持一致,直到发生更改为止。

作为现实世界的示例,请考虑 America/Fort_Nelson,它是在 tzdb 2015g 中为加拿大不列颠哥伦比亚省纳尔逊堡和北落基山脉地区自治市的周边地区添加的。以前,该区域将被解析为America/Vancouver,但由于their March 2015 time change,该区域被分割。 tz_world 地图已于 2015 年 11 月 7 日更新,以反映这一变化。

  • 如果您之前已将 Fort Nelson 的用户解析为 America/Vancouver,那么从 2015 年 11 月 1 日开始,他们的时间将不正确,因为那是温哥华切换回 UTC-8 的时间,而 Fort Nelson 仍然在UTC-7。

  • 如果您更新到最新的 tzdb 和 tz_world,您可以使用原始信息重新确定时区 - 现在将是 America/Fort_Nelson

  • 新时区将准确反映拆分前温哥华的所有信息,以及拆分后纳尔逊堡的正确信息。

假设您在每次更新 tz_world 后更新时区,并在更新 tzdb 后重新计算未来事件,所有这些都应该正常工作。

问题仍然存在,您如何知道哪些区域已拆分和更改,因此您不必重新计算所有内容?对于少量的数据,你还不如重新计算一切。但是对于更大的数据集,这可能是不切实际的。不幸的是,这些差异没有机器可读的标准化格式。我相信这在the tz discussion list之前已经讨论过,但我现在找不到它。喜欢的话可以去那里问问。

目前唯一的方法是手动阅读每个更新的发行说明。您可以在the tz-announce list archives 中找到它们(或订阅列表以获取未来更新)。您还可以在任何给定版本的 NEWS 文件中找到它们。您还需要查看该网站上的 tz_world shapefile 的历史记录。

另外,请认识到时区 ID 永远不会从 tzdb 中删除。拆分可能会创建一个新区域 (Foo/New_Bar),但原始区域将保留 (Foo/Bar,而不是 Foo/Old_Bar)。如果一个区域被确定为不必要,它的Zone 条目可能会被替换为Link 条目,但它永远不会被完全删除。

【讨论】:

  • 很好的答案,非常感谢!实际上,正是与纳尔逊堡的分歧让我想到了整个问题并在这里提出了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多