Основным источником данных для преобразования между идентификаторами часовых поясов Windows и IANA является windowsZones.xml
файл, распространяемый в рамках проекта Unicode CLDR . Последнюю версию Dev можно найти здесь .
Однако CLDR выпускается только дважды в год. Это, наряду с периодической частотой обновлений Windows и нерегулярными обновлениями базы данных часовых поясов IANA, усложняет прямое использование данных CLDR. Имейте в виду, что сами изменения часового пояса производятся по прихоти различных правительств мира, и не все изменения вносятся с достаточным уведомлением, чтобы сделать это в этих циклах выпуска до их соответствующих дат вступления в силу.
Есть несколько других крайних случаев, которые необходимо обработать, которые не охватываются строго CLDR, и время от времени появляются новые. Поэтому я инкапсулировал сложность решения в микробиблиотеке TimeZoneConverter , которую можно установить из Nuget.
Использовать эту библиотеку просто. Вот несколько примеров конвертации:
string tz = TZConvert.IanaToWindows("America/New_York");
// Result: "Eastern Standard Time"
string tz = TZConvert.WindowsToIana("Eastern Standard Time");
// result: "America/New_York"
string tz = TZConvert.WindowsToIana("Eastern Standard Time", "CA");
// result: "America/Toronto"
На сайте проекта есть еще примеры .
Важно понимать, что хотя часовой пояс IANA можно сопоставить с одним часовым поясом Windows, обратное неверно. Один часовой пояс Windows может быть сопоставлен с несколькими часовыми поясами IANA. Это можно увидеть в приведенных выше примерах, где Eastern Standard Time
сопоставляется как с America/New_York
, так и с America/Toronto
. TimeZoneConverter доставит тот, который помечает CLDR "001"
, известный как «золотая зона», если вы не укажете код страны отдельно, и в этой стране не будет совпадения с другой зоной.
Примечание: этот ответ развивался годами, поэтому комментарии ниже могут относиться или не относиться к текущей редакции. Посмотрите историю изменений для деталей. Спасибо.
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
даетAsia/Calcutta
это должно бытьAsia/Kolkata
. кажется,TzdbDateTimeZoneSource
содержит старые значения.Asia/Kolkata
usingIanaToWindows
не работает. но он работает соAsia/Calcutta
старым именем. Вы обновили метод,WindowsToIana
ноIanaToWindows
у вас возникла та же проблема. несколько других зон , которые не работают вAmerica/Argentina/Buenos_Aires
,America/Indiana/Indianapolis
,Asia/Kathmandu
.IanaToWindows
метод компенсации. Огромное спасибо!var canonical = tzdbSource.CanonicalIdMap[ ianaZoneId ]; links = Enumerable.Repeat( canonical, 1 ).Concat( links );
помогло мне.Я знаю, что это старый вопрос, но у меня был вариант использования, которым я хотел бы поделиться здесь, так как это наиболее релевантный пост, который я нашел при поиске. Я разрабатывал приложение .NET Core, используя Docker Linux-контейнер, но для развертывания на сервере Windows. Так что мне нужен был только контейнер Docker Linux для поддержки имен часовых поясов Windows. Я получил это без изменения кода моего приложения, выполнив следующие действия:
Затем в моем .NET-коде следующее работало без каких-либо изменений:
TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
источник
America/Phoenix
чтобы"US Mountain Standard Time"
,Pacific/Honolulu
чтобы"Hawaiian Standard Time"
,America/Anchorage
чтобы"Alaskan Standard Time"
, иAmerica/Adak
в"Aleutian Standard Time"
. Это не распространяется на территории США или исторические противоречия, но поможет вам начать.