Почему так много названий часовых поясов IANA? - PullRequest
0 голосов
/ 31 января 2019

Javascript позволяет вам видеть, сколько времени в другом часовом поясе, если вы задаете IANA с указанным именем этого часового пояса.Например:

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 голосов
/ 31 января 2019

Я буду использовать ваш пример:

Например, Америка / Детройт и Америка / Нью-Йорк находятся в восточном часовом поясе.Почему эти два местоположения не разделяют одно имя часового пояса?

В TZDB запись Zone для 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

В то время как запись Zone для 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

Чтобы полностью расшифровать это, также необходимы записи Rule для US, NYC и Detroit (здесь я не буду копировать / вставлять, но вы можете перейти по ссылкам).

Как вы можете видеть, у Детройта были отличия от Нью-Йорка, последний из которых был в 1975 году, когда Детройт начал переход на летнее время немного позже, чем в большей части восточного часового пояса (27 апреля, показанное здесь, против 23 февраля , заданногоПравило US ).

С тех пор, однако, они были одинаковыми. Правила 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 (и несколько других) - но это полностью ваше решение.

Вам также может быть интересно прочитать файл Theory в tzdbсам, который объясняет концепции и принципы базы данных часовых поясов более подробно.

...