... иногда для (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 *, чтобы узнать, как использовать его для получения идентификатора часового пояса.