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

时间:2019-01-31 11:40:12

标签: javascript timezone timezone-offset ecmascript-next

如果您指定IANA给定的时区名称,则Javascript允许您查看该时区的当前时间。例如:

new Date().toLocaleString("en-US", {timeZone: "America/Chicago"});

在下面,您可以看到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

那为什么有必要?

例如,美国/底特律美国/纽约州(通常)都在东部时区。为什么这两个位置不共享一个IANA时区名称?

纽约的时间是否与底特律的时间不同?

如果没有,那么为什么允许时区名称多于确切的方差数量?

1 个答案:

答案 0 :(得分:5)

我将使用您的示例:

  

例如,美国/底特律和美国/纽约都在东部时区。为什么这两个位置不共享一个时区名称?

在TZDB中,the Zone entry for America/New_York如下所示:

# 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

the Zone entry for America/Detroit看起来像这样:

# 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日,相比2月23日,{{3} }。

从那时起,它们一直是相同的。 given by Rule US对于自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来表示美国东部时区,而忽略{{ 1}}(还有其他一些)-但这完全是您的决定。

您可能还想阅读tzdb本身的The TZDB rules文件,该文件更详细地说明了时区数据库的概念和原理。