Как перевести между часовыми поясами Windows и IANA?

Как описано в wiki часового пояса , существуют два разных стиля часовых поясов.

Многие интернет-интерфейсы API используют временные зоны IANA, но по многочисленным причинам, возможно, потребуется преобразовать их в идентификатор часового пояса Windows или наоборот.

Как это можно сделать в .Net?

Основным источником данных для преобразования между идентификаторами часовых поясов 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" , называемым «золотой зоной», если вы специально не указали код страны, и в этой стране есть совпадение для другой зоны.

Примечание. Этот ответ эволюционировал на протяжении многих лет, поэтому комментарии ниже могут или не могут применяться к текущему пересмотру. Просмотрите историю изменений для деталей. Благодарю.

  • Игнорирование часовых поясов в Rails и PostgreSQL
  • Преобразование дат UTC в другие часовые пояса
  • Веб-сервис - текущий часовой пояс для города?
  • Как элегантно работать с часовыми поясами
  • Как получить часовой пояс из местоположения с использованием координат широты и долготы?
  • Получение даты с на несколько часов
  • Как мне заполнить список часовых поясов IANA / Olson от Noda Time?
  • Как правильно установить JVM TimeZone
  • Получить имя часового пояса
  • Как получить смещение часовой пояс в GMT (как GMT + 7: 00) с устройства Android?
  • .NET DateTime.Now возвращает неправильное время, когда изменяется часовой пояс
  • Давайте будем гением компьютера.