Когда я использую MomentJS или API Интернационализации, я получаю устаревшие часовые пояса, такие как Asia/Katmandu
или же Asia/Calcutta
в хроме! Вместо этого они должны быть выведены как Asia/Kathmandu
а также Asia/Kolkata
,
Как это исправить?
Здесь я написал очень маленький код для сравнения, который может быть полезен для вас. Я использовал файл унифицированных данных и извлек все данные. Этот список покажет вам сравнение между новыми и устаревшими данными.
$("#div1").load("https://momentjs.com/downloads/moment-timezone-with-data.js", function(responseTxt, statusTxt, xhr) {
if (statusTxt == "success") {
//console.log("External content loaded successfully!");
keepMeUpdated();
}
if (statusTxt == "error")
console.log("Error: " + xhr.status + ": " + xhr.statusText);
});
function keepMeUpdated() {
var str = $("#div1").html();
str = str.slice(str.lastIndexOf("loadData"), str.length - 1);
str = str.slice(0, str.indexOf(')'));
str = str.replace('loadData(', '');
$("#div1").html(str);
compareNow();
}
function compareNow() {
var str = $("#div1").html();
var obj = JSON.parse(str);
var links = obj.links;
var counter = 0;
var te = "There are " + obj.zones.length + " timezones available. From these timezones " + links.length + " have recently got updated."$("#head").html(te);
for (var i = 0; i < links.length; i++) {
var ele = links[i];
var spl = ele.split('|');
var isSame = spl[0] == spl[1];
if (!isSame) {
counter++;
var text = '<tr><td>' + counter + "</td><td>" + spl[1] + "</td><td> " + spl[0] + '</td></tr>';
$("#mm tbody").append(text);
}
}
}
@import url("https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css");
#div1 {
display: none;
}
#head {
font-size: 18px;
font-weight: bold;
margin: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<div id='head'></div>
<div>
<table id='mm' class="table table-striped">
<thead>
<th>Sr</th>
<th>Obsolete Data</th>
<th>Updated Data</th>
</thead>
<tbody>
</tbody>
</table>
</div>
<div id='div1'></div>
Я составил список устаревших часовых поясов, которые вы можете использовать для сравнения неправильного и правильного часовых поясов.
Постскриптум На самом деле, если вы используете PHP, это может оказаться огромной проблемой при выполнении date_default_timezone_set()
,
Итак, вот список:
(Левая сторона неправильная, а правая — правая)
Africa/Asmera = Africa/Asmara
Africa/Timbuktu = Africa/Abidjan
America/Argentina/ComodRivadavia = America/Argentina/Catamarca
America/Atka = America/Adak
America/Buenos_Aires = America/Argentina/Buenos_Aires
America/Catamarca = America/Argentina/Catamarca
America/Coral_Harbour = America/Atikokan
America/Cordoba = America/Argentina/Cordoba
America/Ensenada = America/Tijuana
America/Fort_Wayne = America/Indiana/Indianapolis
America/Indianapolis = America/Indiana/Indianapolis
America/Jujuy = America/Argentina/Jujuy
America/Knox_IN = America/Indiana/Knox
America/Louisville = America/Kentucky/Louisville
America/Mendoza = America/Argentina/Mendoza
America/Montreal = America/Toronto
America/Porto_Acre = America/Rio_Branco
America/Rosario = America/Argentina/Cordoba
America/Santa_Isabel = America/Tijuana
America/Shiprock = America/Denver
America/Virgin = America/Port_of_Spain
Antarctica/South_Pole = Pacific/Auckland
Asia/Ashkhabad = Asia/Ashgabat
Asia/Calcutta = Asia/Kolkata
Asia/Chongqing = Asia/Shanghai
Asia/Chungking = Asia/Shanghai
Asia/Dacca = Asia/Dhaka
Asia/Harbin = Asia/Shanghai
Asia/Istanbul = Europe/Istanbul
Asia/Kashgar = Asia/Urumqi
Asia/Katmandu = Asia/Kathmandu
Asia/Macao = Asia/Macau
Asia/Rangoon = Asia/Yangon
Asia/Saigon = Asia/Ho_Chi_Minh
Asia/Tel_Aviv = Asia/Jerusalem
Asia/Thimbu = Asia/Thimphu
Asia/Ujung_Pandang = Asia/Makassar
Asia/Ulan_Bator = Asia/Ulaanbaatar
Atlantic/Faeroe = Atlantic/Faroe
Atlantic/Jan_Mayen = Europe/Oslo
Australia/ACT = Australia/Sydney
Australia/Canberra = Australia/Sydney
Australia/LHI = Australia/Lord_Howe
Australia/North = Australia/Darwin
Australia/NSW = Australia/Sydney
Australia/Queensland = Australia/Brisbane
Australia/South = Australia/Adelaide
Australia/Tasmania = Australia/Hobart
Australia/Victoria = Australia/Melbourne
Australia/West = Australia/Perth
Australia/Yancowinna = Australia/Broken_Hill
Brazil/Acre = America/Rio_Branco
Brazil/DeNoronha = America/Noronha
Brazil/East = America/Sao_Paulo
Brazil/West = America/Manaus
Canada/Atlantic = America/Halifax
Canada/Central = America/Winnipeg
Canada/Eastern = America/Toronto
Canada/Mountain = America/Edmonton
Canada/Newfoundland = America/St_Johns
Canada/Pacific = America/Vancouver
Canada/Saskatchewan = America/Regina
Canada/Yukon = America/Whitehorse
Chile/Continental = America/Santiago
Chile/EasterIsland = Pacific/Easter
Cuba = America/Havana
Egypt = Africa/Cairo
Eire = Europe/Dublin
Europe/Belfast = Europe/London
Europe/Tiraspol = Europe/Chisinau
GB = Europe/London
GB-Eire = Europe/London
Hongkong = Asia/Hong_Kong
Iceland = Atlantic/Reykjavik
Iran = Asia/Tehran
Israel = Asia/Jerusalem
Jamaica = America/Jamaica
Japan = Asia/Tokyo
Kwajalein = Pacific/Kwajalein
Libya = Africa/Tripoli
Mexico/BajaNorte = America/Tijuana
Mexico/BajaSur = America/Mazatlan
Mexico/General = America/Mexico_City
Navajo = America/Denver
NZ = Pacific/Auckland
NZ-CHAT = Pacific/Chatham
Pacific/Johnston = Pacific/Honolulu
Pacific/Ponape = Pacific/Pohnpei
Pacific/Samoa = Pacific/Pago_Pago
Pacific/Truk = Pacific/Chuuk
Pacific/Yap = Pacific/Chuuk
Poland = Europe/Warsaw
Portugal = Europe/Lisbon
PRC = Asia/Shanghai
ROC = Asia/Taipei
ROK = Asia/Seoul
Singapore = Asia/Singapore
Turkey = Europe/Istanbul
US/Alaska = America/Anchorage
US/Aleutian = America/Adak
US/Arizona = America/Phoenix
US/Central = America/Chicago
US/Eastern = America/New_York
US/East-Indiana = America/Indiana/Indianapolis
US/Hawaii = Pacific/Honolulu
US/Indiana-Starke =America/Indiana/Knox
US/Michigan = America/Detroit
US/Mountain = America/Denver
US/Pacific = America/Los_Angeles
US/Pacific-New = America/Los_Angeles
US/Samoa = Pacific/Pago_Pago
W-SU = Europe/Moscow
Zulu = Etc/UTC
UTC = Etc/UTC
UCT = Etc/UCT
Universal = Etc/UTC
GMT = Etc/GMT
GMT+0 = Etc/GMT
GMT0 = Etc/GMT
GMT−0 = Etc/GMT
Greenwich = Etc/GMT
Etc/Greenwich = Etc/GMT
Etc/Universal = Etc/UTC
Etc/Zulu = Etc/UTC
Etc/GMT0 = Etc/GMT
Etc/GMT-0 = Etc/GMT
Etc/GMT+0 = Etc/GMT
Этот список может быть еще неполным, но должен помочь большинству из вас. Если вы нашли больше неправильных, пожалуйста, прокомментируйте это.
Ваш вопрос немного ошибочен, так как в tzdb обычно нет таких вещей, как «устаревшие» часовые пояса. В генеральный, как только tzdb ввел идентификатор, он будет продолжать поддерживать его бесконечно — либо как Zone
или как Link
,
Единственное исключение Canada/East-Saskatchewan
, который был удален из tzdb в версии 2017c, потому что он был неправильным и превысил 14-символьный предел, установленный сопровождающими tzdb. Любое использование этой зоны должно быть обновлено до America/Regina
,
Приведенные вами примеры и список показывают, что вы хотели бы канонического Zone
записи, а не их псевдонимы Link
записей. Пока допустимы либо все реализации tzdb должен Разрешить ссылки правильно, действительно, как правило, должно быть предпочтительным. Поэтому я могу понять ваше желание разрешить все ссылки.
Тем не менее, текущая реализация построителя файла данных в момент-часовой пояс не различает зоны TZDB и ссылки при построении данных. Вместо этого он создает собственную запись зоны для первых уникальных данных, с которыми он сталкивается, а затем создает собственную запись ссылки для любого последующего совпадения. Это имеет недостаток, заключающийся в размещении канонических зон tzdb спереди и по центру (что влияет на API, такие как moment.tz.guess()
в старых браузерах), но также имеет преимущество, заключающееся в возможности связывать зоны, которые идентичны в течение периода, охватываемого файлом данных.
Например, если вы посмотрите на текущий moment-timezone-with-data-2012-2022.js
файл, вы найдете это Europe/Paris
является единственной записью зоны для большинства мест, где используется CET / CEST. Остальные ссылки обратно на Europe/Paris
в этом файле даже те, которые имеют отдельные канонические зоны tzdb, такие как Europe/Amsterdam
, Europe/Berlin
, и другие.
Этот компромисс был дизайнерским решением первоначального автора момента-часового пояса и, как правило, не изменится. Он сохраняет файл данных меньше, чем в противном случае.
Кроме того, если вы ориентируетесь на современные браузеры (и / или Node.js), я настоятельно рекомендую использовать Luxon вместо. Это более новая библиотека от команды Moment, которая имеет преимущество поддержки часовых поясов без отправки файла данных (поскольку большинство современных сред поддерживают API-интерфейсы Intl).
Стоит также отметить, что Intl API имеет тенденцию реализовываться через ICU, который получает некоторые данные из TZDB, а некоторые из CLDR. Эти два проекта имеют несколько разные представления о том, что является «каноническим». По сути, каноническая зона в CLDR — это та, которая была введена первой, и она никогда не меняется — даже если TZDB решит перейти к ссылке и заменить ее новым именем. Например, вы можете получить Asia/Calcutta
как часовой пояс по умолчанию для Индии из некоторых реализаций Intl, потому что CLDR считает его каноническим. Это еще одна причина, хотя важно, чтобы все реализации одинаково поддерживали обе формы идентификаторов.