0

Moment-timezone time 有方法 momnet.tz 需要两个参数:

  • 特定日期时间
  • 时区名称

它返回给定日期时间中给定时区的时移(到 UTC)。好的。

困扰我的问题:

  • 当前属于特定时区的所有位置过去是否也属于该时区?
  • 因此,如果两个位置甚至当前属于某个时区,那么在过去(甚至在 1970 年之后)是否可能实际上具有不同的时区(转换为 UTC)。
  • 原则上是否可以查询 tz-db 以获取特定的某种位置,而不是时区名称。

如果有人能消除我的疑虑,将不胜感激。

4

1 回答 1

1

Moment-timezone 使用来自IANA 时区数据库(又名 TZDB、zoneinfo 或 Olson 数据库)的数据。您的大多数问题都是由该数据解决的,而不是由时刻时区本身解决的。您会发现其他实现(对于其他语言、平台等)具有类似的行为。

在 tzdb 本身的理论文件Wikipedia 上有大量关于 tzdb 如何工作的信息,但我会看看是否可以解决您的具体问题:

当前属于特定时区的所有位置过去是否也属于该时区?

TZDB 根据城市分配时区(因为与其他区域边界相比,它们不太可能随时间变化)。通常,将选择给定区域内自 1970 年以来时钟已对齐的一个城市来表示该区域的时间。

当该区域的另一部分更改其时钟的方式与该区域的其他部分不同时,将创建一个新时区,并在该区域内选择一个新城市来代表该区域。我们称之为“区域分割”。两个区域中分裂前的时间将匹配(LMT条目除外),分裂和转发的时间会有所偏差。未来某个时间这些地区的时间是否再次对齐并不重要。现在有两个区域,并且将继续存在 - 因为它们在过去的某个时候偏离了。

因此,如果两个位置甚至当前属于某个时区,那么在过去(甚至在 1970 年之后)是否可能实际上具有不同的时区(转换为 UTC)。

如果该地区有不同的计时历史,则将有两个不同的时区条目。因此,当您说“位置”时,如果您是指在 TZDB 中具有自己时区名称的两个不同城市,那么根据定义,它们不属于同一时区。例如,Europe/Moscow两者Europe/Volgograd目前都在 UTC+3 全年无夏令时。然而,在 1992 年初,莫斯科是 UTC+3,而伏尔加格勒是 UTC+4。他们在此之前的历史更加偏离了。

另一方面,如果您谈论的是在 TZDB 中特别引用的位置,则存在对齐的假设。例如,西雅图位于美国太平洋时区,所有时区都用 表示America/Los_Angeles。因为没有唯一的America/Seattle,所以数据表示西雅图没有比洛杉矶唯一的时区历史。

也就是说 - 过去曾出现过一些非常小的边缘案例,即位于两个时区边界线上的小镇必须在观察哪个时区之间做出选择。还发生过明显位于边界一侧的小镇选择非正式地遵循边界另一侧邻近较大城市的时区的情况。这些更改有时会在 tzdb 讨论列表中提及,但很少在数据中记录为不同的区域。

对于这些边缘情况,请记住 TZDB 只跟踪城市,而不是可能划分城市或城镇的区域边界。为此,您必须使用不同的数据源。我所知道的最好的一个是 Evan Siroky 的时区边界建设者项目。

原则上是否可以查询 tz-db 以获取特定的某种位置,而不是时区名称。

您必须更具体地说明“位置”的含义。如果您的意思是纬度/经度坐标 - 那么 timezone-boundary-builder 数据以及使用它们的项目就是要走的路线。它们将帮助您解析 tzdb 标识符,然后您可以将其与时刻时区或其他库一起使用。

于 2018-08-15T17:25:24.570 回答