Часовой пояс момента обнаруживает часовой пояс, дающий различные значения для того же часового пояса - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу получить код страны для любой страны на основе текущего часового пояса.

Для достижения этой цели я использую пакеты Momentjs и страны-часовые пояса в своем проекте Reaction JS.

Все работает нормально, за исключением иногда (UTC +01:00) West Central Africa часового пояса. Я получаю эти значения Africa/Lagos и Africa/Luanda.

В моем случае я хотел получить код страны для Анголы, столицей которой является Луанда, но поскольку я использую countries-and-timezones, он не имеет Africa/Luanda в качестве часового пояса Анголы, который выдает неопределенную ошибку.

И когда я посмотрел в упакованный файл Momentjs data.json , я нашел это: "Africa/Lagos|Africa/Luanda".И это не единственный часовой пояс, который обновляется, их много.

Итак, что я хочу знать:
Как получить исходное значение Africa/Lagos из функции Moment.tz.guess().Потому что я не хочу редактировать data.json, который я использую с countries-and-timezones, чтобы исправить ошибку.Кроме того, я нашел много таких файлов JSON, которые содержат те же старые часовые пояса.

Или есть какая-нибудь лучшая библиотека для получения кода страны из часовых поясов, потому что я не могу использовать такие службы, как timezonedb или ip-apiполучить код страны с IP-адресов.Любая помощь очень ценится.

1 Ответ

0 голосов
/ 30 сентября 2018

... иногда для (UTC+01:00) West Central Africa часового пояса я получаю эти значения Africa/Lagos и Africa/Luanda.

Это правильно.Существует несколько действительных сопоставлений часовых поясов IANA для упомянутого вами часового пояса Windows.Unicode CLDR является авторитетом для этих отображений, которые вы можете просмотреть в файле windowsZones.xml, и в настоящее время выглядит так:

<!--  (UTC+01:00) West Central Africa  -->
<mapZone other="W. Central Africa Standard Time" territory="001" type="Africa/Lagos"/>
<mapZone other="W. Central Africa Standard Time" territory="AO" type="Africa/Luanda"/>
<mapZone other="W. Central Africa Standard Time" territory="BJ" type="Africa/Porto-Novo"/>
<mapZone other="W. Central Africa Standard Time" territory="CD" type="Africa/Kinshasa"/>
<mapZone other="W. Central Africa Standard Time" territory="CF" type="Africa/Bangui"/>
<mapZone other="W. Central Africa Standard Time" territory="CG" type="Africa/Brazzaville"/>
<mapZone other="W. Central Africa Standard Time" territory="CM" type="Africa/Douala"/>
<mapZone other="W. Central Africa Standard Time" territory="DZ" type="Africa/Algiers"/>
<mapZone other="W. Central Africa Standard Time" territory="GA" type="Africa/Libreville"/>
<mapZone other="W. Central Africa Standard Time" territory="GQ" type="Africa/Malabo"/>
<mapZone other="W. Central Africa Standard Time" territory="NE" type="Africa/Niamey"/>
<mapZone other="W. Central Africa Standard Time" territory="NG" type="Africa/Lagos"/>
<mapZone other="W. Central Africa Standard Time" territory="TD" type="Africa/Ndjamena"/>
<mapZone other="W. Central Africa Standard Time" territory="TN" type="Africa/Tunis"/>
<mapZone other="W. Central Africa Standard Time" territory="ZZ" type="Etc/GMT-1"/>

По большей части всеПеречисленные зоны IANA эквивалентны, и все они соответствуют указанной зоне Windows.Africa/Lagos определяется CLDR как «золотая зона» (territory="001").Как правило, реализация должна использовать отображение, специфичное для кода страны, когда код страны доступен, и использовать золотую зону в противном случае.

..., поскольку я использую countries-and-timezones, она не имеетАфрика / Луанда как часовой пояс Анголы ...

Из источников GitHub этого конкретного пакета не ясно, откуда берутся их данные.Кроме того, он не обновлялся в течение 3 лет.Без регулярных обновлений и четкого источника происхождения такие пакеты, как правило, бесполезны (ИМХО).

... когда я посмотрел в упакованный файл Momentjs data.json, я обнаружил следующее: "Africa /Лагос | Африка / Луанда».И это не единственный часовой пояс, который обновляется, их много.

Действительно, Момент-часовой пояс свяжет эквивалентные зоны.Одна деталь реализации, которую нужно распознать, это то, что этот момент не обязательно ставит «золотую зону» на первое место.Он просто идет в алфавитном порядке, и когда он видит две зоны с одинаковыми данными, он объединяет их.Это относительно неважно, так как сами часовые пояса действительно имеют одинаковые данные (смещения, переходы и сокращения соответствуют).

Как получить исходное значение Africa / Lagos из Moment.tz.guess()function.

Ну, здесь нет "оригинального" значения, поэтому вы не можете.Первоначальным значением будет часовой пояс Windows («Стандартное время W. Центральная Африка»).Сначала Момент пытается использовать API-интерфейс JavaScript Intl для получения идентификатора часового пояса IANA непосредственно из браузера - поэтому в зависимости от реализации браузер может вернуть любой эквивалентный идентификатор часового пояса.Таким образом, некоторые реализации могут давать Africa/Lagos, а некоторые могут давать Africa/Luanda или любые другие в отображении CLDR для этой зоны.

Для реализаций, где API Intl отсутствует, moment.tz.guess проверит смещения вашего местного часового пояса по отношению к имеющимся у него данным (независимо от того, что вы загрузили) и выберите тот, который соответствует.Если есть связь, есть некоторые дополнительные данные о населении, чтобы выбрать более распространенную.Вы можете прочитать об этих деталях в документации по моменту-часовому поясу и в реализации функции moment.tz.guess в исходном коде.

Имейте в виду, что только потому, что вы получаете разные результаты от moment.tz.guess в разныхсреда не означает, что эти результаты являются недействительными.Вы по-прежнему сможете использовать любой возвращенный вам результат.

Или есть какая-нибудь лучшая библиотека для получения кода страны из часовых поясов ...

Не знаюЯ не знаю хорошо поддерживаемой библиотеки для JavaScript, которая пока удобно для вас.Я испытываю желание создать его (как я уже сделал для .NET), но в то же время вы можете прочитать версию JSON файла сопоставления CLDR и проанализировать его самостоятельно.

... потому что я не могу использовать такие сервисы, как timezonedb или ip-api для получения кода страны с IP-адресов ...

Кроме IP-адреса, вы можетеПодумайте, есть ли у вас местоположение с широтой / долготой?Если это так, то посмотрите методы, перечисленные в этом вопросе 1064 *, чтобы узнать, как использовать его для получения идентификатора часового пояса.

...