Ответ 1
Основным источником данных для преобразования между идентификаторами часовых поясов Windows и IANA является файл windowsZones.xml
, распространяемый в рамках проекта Unicode CLDR.
Тем не менее, 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"
, известный как "золотая зона", если вы не укажете код страны и не совпадете с другой зоной в этой стране.
Примечание. Этот ответ развивался годами, поэтому комментарии ниже могут относиться или не относиться к текущей редакции. Посмотрите историю изменений для деталей. Благодарю.