按时区与位置查询

时间:2018-08-15 13:35:24

标签: timezone moment-timezone

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

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

它返回给定日期时间在给定时区的时移(至UTC)。好吧。

困扰我的问题:

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

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

1 个答案:

答案 0 :(得分:1)

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

关于theory file in the tzdb itselfon Wikipedia中tzdb的工作方式的信息很多,但是我看能否解决您的特定问题:

  

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

TZDB根据城市分配时区(因为与其他地区边界相比,它们随时间变化的可能性较小)。通常,将选择给定区域内时钟从1970年开始一直对齐的一个城市来代表该区域的时间。

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

  

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

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

另一方面,如果您谈论的是TZDB中未专门引用的位置 ,则存在对齐方式的推定。例如,西雅图位于美国太平洋时区,全部由America/Los_Angeles表示。因为没有唯一的America/Seattle,所以数据表示西雅图没有洛杉矶以外的唯一时区历史。

也就是说-过去发生了一些非常小的情况,在两个时区之间的边界线上的一个小镇必须在要观察的区域之间进行选择。还发生了一个明显位于边界一侧的小镇选择非官方地跟随边界另一侧的相邻大城市中的时区。这些更改有时会在tzdb讨论列表中提到,但很少在数据中记录为一个单独的区域。

在这些极端情况下,请记住,TZDB仅跟踪城市,而不跟踪可能划分城市或城镇的区域边界。为此,您必须使用其他数据源。我所知道的最好的是埃文·西洛基(Evan Siroky)的timezone-boundary-builder项目。

  

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

您必须更具体地说明“位置”的含义。如果您指的是纬度/经度坐标,则时区边界构建者数据and the projects that use them是您要走的路线。它们将帮助您解析tzdb标识符,然后可以将其与moment-timezone或其他库一起使用。