为什么有这么多 IANA 时区名称?
Why So Many IANA Time Zones Names?
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/Detroit 和 America/New_York 都(通常)在东部时区。为什么这两个位置不共享一个 IANA 时区名称?
一年中有哪些时候纽约的时间与底特律的时间不同吗?
如果不是,那么为什么允许时区名称多于确切的差异数?
我将使用您的示例:
For example, both America/Detroit and America/New_York are in the Eastern Time Zone. Why don't these two locations share a single timezone name?
在 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
要完全破译这一点,还需要 US
, NYC
, and Detroit
的 Rule
条目(我不会在此处 copy/paste,但您可以点击链接)。
如您所见,底特律与纽约有所不同,最后一次发生在 1975 年,当时底特律开始夏令时的时间略晚于大部分东部时区(此处显示的是 4 月 27 日与 2 月 23 日 given by Rule US).
然而,从那时起,他们就一样了。 The TZDB rules 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 文件,它更详细地解释了时区数据库的概念和原理。
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/Detroit 和 America/New_York 都(通常)在东部时区。为什么这两个位置不共享一个 IANA 时区名称?
一年中有哪些时候纽约的时间与底特律的时间不同吗?
如果不是,那么为什么允许时区名称多于确切的差异数?
我将使用您的示例:
For example, both America/Detroit and America/New_York are in the Eastern Time Zone. Why don't these two locations share a single timezone name?
在 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
要完全破译这一点,还需要 US
, NYC
, and Detroit
的 Rule
条目(我不会在此处 copy/paste,但您可以点击链接)。
如您所见,底特律与纽约有所不同,最后一次发生在 1975 年,当时底特律开始夏令时的时间略晚于大部分东部时区(此处显示的是 4 月 27 日与 2 月 23 日 given by Rule US).
然而,从那时起,他们就一样了。 The TZDB rules 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 文件,它更详细地解释了时区数据库的概念和原理。