为什么有这么多IANA时区名称?

24

Javascript可以让你查看另一个时区的时间,只需指定该时区的IANA名称即可。例如:

let strTime = new Date().toLocaleString("en-US", {timeZone: "America/Chicago"});
console.log(strTime);

下面你可以看到,IANA在每个通用时区内提供了多个名称:

America/New_York    Eastern (most areas)
America/Detroit Eastern - MI (most areas)
America/Kentucky/Louisville Eastern - KY (Louisville area)
America/Kentucky/Monticello Eastern - KY (Wayne)
America/Indiana/Indianapolis    Eastern - IN (most areas)
America/Indiana/Vincennes   Eastern - IN (Da, Du, K, Mn)
America/Indiana/Winamac Eastern - IN (Pulaski)
America/Indiana/Marengo Eastern - IN (Crawford)
America/Indiana/Petersburg  Eastern - IN (Pike)
America/Indiana/Vevay   Eastern - IN (Switzerland)
America/Chicago Central (most areas)
America/Indiana/Tell_City   Central - IN (Perry)
America/Indiana/Knox    Central - IN (Starke)
America/Menominee   Central - MI (Wisconsin border)
America/North_Dakota/Center Central - ND (Oliver)
America/North_Dakota/New_Salem  Central - ND (Morton rural)
America/North_Dakota/Beulah Central - ND (Mercer)
America/Denver  Mountain (most areas)
America/Boise   Mountain - ID (south); OR (east)
America/Phoenix MST - Arizona (except Navajo)
America/Los_Angeles Pacific
America/Anchorage   Alaska (most areas)
America/Juneau  Alaska - Juneau area
America/Sitka   Alaska - Sitka area
America/Metlakatla  Alaska - Annette Island
America/Yakutat Alaska - Yakutat
America/Nome    Alaska (west)
America/Adak    Aleutian Islands
Pacific/Honolulu    Hawaii

为什么这是必要的?

例如,America/DetroitAmerica/New_York一般都处于美国东部时区,为什么这两个地方没有共享一个单独的IANA时区名称呢?

纽约和底特律是否有一年中时间不同的情况?

如果没有,那么为什么允许更多的时区名称而不是确切的差异数字?


4
数据库中的每个主要条目代表自1970年以来所有已同意的文明时钟集合的一个时区。通常通过大陆或海洋来确定时区,然后再通过包含时钟的区域内最大城市的名称来识别时区...来源:IANA->时区和夏令时数据来源 - Andreas
我可以安全地假设,在给定时区中的所有不同IANA名称在夏令时方面的行为完全相同吗? - Lonnie Best
2
这些时区之间可能存在历史差异和/或仍然存在夏令时方面的差异,或者将来可能再次存在差异。我不确定这完全是为了方便。 - deceze
1
@marekful - 这些名称不仅仅是指偏移量,而是指特定地区的民用时间经历的完整偏移量、转换日期/时间和缩写。此外,人们不能仅仅选择最近的城市,而是必须知道哪个城市与相同的当地时间对齐。考虑到靠近地缘政治边界的城市可能会与远离边境的城市的时间对齐,而不是刚刚跨越边境的城市。 - Matt Johnson-Pint
1
@LonnieBest - 不,你不能安全地假设那样。你必须将每个条目视为一个独特的实体。如果你想知道它们何时对齐以及何时不同,那么你要么必须检查源代码,要么编写代码来寻找差异。还有一些网站,比如timeanddate.com,可以帮助你更轻松地深入了解细节。 - Matt Johnson-Pint
1
这与方便毫不相关。人们经常问为什么他们最喜欢的城市没有自己的区域,答案是它不会包含与用户最喜欢的城市不同的数据。 - Josh Lee
1个回答

44
我将使用你的例子:
例如,美国/底特律和美国/纽约都在东部时区。为什么这两个位置没有共享一个时区名称?
在 TZDB 中,America/New_YorkZone条目看起来像这样:
# Zone  NAME              GMTOFF    RULES   FORMAT   [UNTIL]
Zone    America/New_York  -4:56:02  -       LMT      1883 Nov 18 12:03:58
                          -5:00     US      E%sT     1920
                          -5:00     NYC     E%sT     1942
                          -5:00     US      E%sT     1946
                          -5:00     NYC     E%sT     1967
                          -5:00     US      E%sT

虽然America/DetroitZone条目看起来像这样:

# Zone  NAME              GMTOFF    RULES   FORMAT   [UNTIL]
Zone    America/Detroit   -5:32:11  -       LMT      1905
                          -6:00     -       CST      1915 May 15  2:00
                          -5:00     -       EST      1942
                          -5:00     US      E%sT     1946
                          -5:00     Detroit E%sT     1973
                          -5:00     US      E%sT     1975
                          -5:00     -       EST      1975 Apr 27  2:00
                          -5:00     US      E%sT

要完全解密此内容,还需要USNYCDetroitRule条目(我不会在这里复制/粘贴,但您可以按链接操作)。
如您所见,底特律与纽约有所不同,最后一次是在1975年,当时底特律开始夏令时比大多数东部时区稍晚(这里显示的是4月27日,而由Rule US给出为2月23日)。
然而,自那以后它们就一直相同。TZDB规则要求对于自1970年以来已经达成协议的地区使用唯一的区域标识符,并且这些地区在1973年和1975年存在偏差,因此需要唯一的区域标识符。
可以通过JavaScript这样看到这种差异:
var d = new Date("1975-03-01T00:00:00.000Z"); // Midnight UTC on March 1st
d.toLocaleString("en-US", {timeZone: "America/New_York"})  //=> "2/28/1975, 8:00:00 PM"
d.toLocaleString("en-US", {timeZone: "America/Detroit"})   //=> "2/28/1975, 7:00:00 PM"

当然,如果在您的应用程序中从未涉及到远古日期,那么您可以使用America/New_York代表美国东部时区,并省略America/Detroit(以及其他一些)-但这完全取决于您的决定。 您可能还有兴趣阅读tzdb本身的Theory文件,其中更详细地解释了时区数据库的概念和原则。

1
顺便提一下:我发现在Chromium 71中缺少了几个官方时区的支持,我已经在这里报告了(https://bugs.chromium.org/p/chromium/issues/detail?id=928068)。 - Lonnie Best

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接