如何处理新时区?

时间:2015-11-26 17:01:38

标签: datetime time timezone

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

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

即。有一个城市Foo,时区Foo/Bar。有一天tzdata发生了变化,Foo/Bar分为Foo/Old_BarFoo/New_Bar个时区,并且具有相同的UTC偏移量。我们的数据库中仍然有Foo/Bar。实际上,这是一次BC休息,但是没关系,因为我们可以处理这些BC休息时间。但是后来tzdata又被改变了,现在Foo/New_Bar有不同的偏移。这就是麻烦。 Foo城市的一些用户从那时起就看错了当地时间。

只是为了确保你理解我:这不是关于DST,而是时区(他们的名字)正在被改变

据我所知,我们需要一种机器可读的tzdata差异。像

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

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

1 个答案:

答案 0 :(得分:3)

特别关注IANA / Olson TZ数据库,位置标识符一旦建立就不会改变。每个标识符的历史记录始终与该位置的一致

但是,如果您使用tz_world或其他某个地图来源来确定某些其他位置的时区 - 一个不一定拥有拥有标识符的位置,那么是 - 区域分割可能会导致区域发生变化。但是,当它发生时,新区域应与旧区域保持一致,直至变化点。

作为一个真实世界的例子,请考虑{0}在tzdb 2015g中添加到加拿大不列颠哥伦比亚省的纳尔逊堡以及北落基山脉地区的周边地区。以前,此区域已解决为America/Fort_Nelson,但由于their March 2015 time change,该区域已拆分。 tz_world地图于2015年11月7日更新,以说明此更改。

  • 如果您之前已经将纳尔逊堡的用户解决为America/Vancouver,那么从2015年11月1日开始,他们将有不正确的时间,因为当温哥华切换回UTC-8时,尼尔森堡保持在UTC-7。

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

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

假设您在每次更新tz_world后更新时区,并在更新tzdb后重新计算未来事件,所有这一切都应该有效。

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

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

此外,请确认时区ID永远不会从tzdb 删除。拆分可以创建新区域(NEWS),但原始区域将保留(Foo/New_Bar,而不是Foo/Bar)。如果确定区域不必要,则其Foo/Old_Bar条目可能会替换为Zone条目,但永远不会完全删除。