Преобразование Microsoft Timezone в стандартные данные часового пояса в рельсах

У меня есть приложение rails, которое подключается к БД SQL Server, и есть приложение для рабочего стола Windows, которое подключается к той же БД. Приложение Windows использует базу данных часовых поясов Microsoft Windows, поэтому я получаю название часового пояса, например Pacific Daylight Time, В рельсах ActiveSupport::TimeZone класс дает нам хэш сопоставления, где ключ будет как Pacific Time (US & Canada) и значение будет как America/Los_Angeles, Есть ли уже что-нибудь, что преобразует формат Windows в стандартный формат, чтобы я мог использовать Time.zone?

Или, может быть, есть драгоценный камень часового пояса, который позволит мне настроить рельсы для использования формата Windows?

Вот массив, который я начал помогать с конвертацией, но есть немного, в котором я не уверен на 100%.

  DAYLIGHT = [
{name: 'Dateline Daylight Time',          offset: -12,  alt: 'International Date Line West'},
{name: 'UTC-11',                          offset: -11,  alt: ''},
{name: 'Hawaiian Daylight Time',          offset: -10,  alt: 'Hawaii'},
{name: 'Alaskan Daylight Time',           offset: -9,   alt: 'Alaska'},
{name: 'Pacific Daylight Time (Mexico)',  offset: -8,   alt: ''},
{name: 'Pacific Daylight Time',           offset: -8,   alt: 'Pacific Time (US & Canada)'},
{name: 'US Mountain Daylight Time',       offset: -7,   alt: 'Mountain Time (US & Canada)'},
{name: 'Mountain Daylight Time (Mexico)', offset: -7,   alt: ''},
{name: 'Mountain Daylight Time',          offset: -7,   alt: 'Mountain Time (US & Canada)'},
{name: 'Central America Daylight Time',   offset: -6,   alt: 'Central Time (US & Canada)'},
{name: 'Central Daylight Time',           offset: -6,   alt: 'Central Time (US & Canada)'},
{name: 'Central Daylight Time (Mexico)',  offset: -6,   alt: ''},
{name: 'Canada Central Daylight Time',    offset: -6,   alt: ''},
{name: 'SA Pacific Daylight Time',        offset: -5,   alt: ''},
{name: 'Eastern Daylight Time',           offset: -5,   alt: 'Eastern Time (US & Canada)'},
{name: 'US Eastern Daylight Time',        offset: -5,   alt: 'Eastern Time (US & Canada)'},
{name: 'Venezuela Daylight Time',         offset: -4.5, alt: ''},
{name: 'Paraguay Daylight Time',          offset: -4,   alt: ''},
{name: 'Atlantic Daylight Time',          offset: -4,   alt: ''},
{name: 'Central Brazilian Daylight Time', offset: -4,   alt: ''},
{name: 'SA Western Daylight Time',        offset: -4,   alt: ''},
{name: 'Pacific SA Daylight Time',        offset: -4,   alt: ''},
{name: 'Newfoundland Daylight Time',      offset: -3.5, alt: ''},
{name: 'E. South America Daylight Time',  offset: -3,   alt: ''},
{name: 'Argentina Daylight Time',         offset: -3,   alt: ''},
{name: 'SA Eastern Daylight Time',        offset: -3,   alt: ''},
{name: 'Greenland Daylight Time',         offset: -3,   alt: ''},
{name: 'Montevideo Daylight Time',        offset: -3,   alt: ''},
{name: 'Bahia Daylight Time',             offset: -3,   alt: ''},
{name: 'UTC-02',                          offset: -2,   alt: ''},
{name: 'Mid-Atlantic Daylight Time',      offset: -2,   alt: ''},
{name: 'Azores Daylight Time',            offset: -1,   alt: ''},
{name: 'Cabo Verde Daylight Time',        offset: -1,   alt: ''},
{name: 'Morocco Daylight Time',           offset: 0,    alt: ''},
{name: 'Coordinated Universal Time',      offset: 0,    alt: ''},
{name: 'GMT Daylight Time',               offset: 0,    alt: ''},
{name: 'Greenwich Daylight Time',         offset: 0,    alt: ''},
{name: 'W. Europe Daylight Time',         offset: 1,    alt: ''},
{name: 'Central Europe Daylight Time',    offset: 1,    alt: ''},
{name: 'Romance Daylight Time',           offset: 1,    alt: ''},
{name: 'Central European Daylight Time',  offset: 1,    alt: ''},
{name: 'W. Central Africa Daylight Time', offset: 1,    alt: ''},
{name: 'Namibia Daylight Time',           offset: 1,    alt: ''},
{name: 'Jordan Daylight Time',            offset: 2,    alt: ''},
{name: 'GTB Daylight Time',               offset: 2,    alt: ''},
{name: 'Middle East Daylight Time',       offset: 2,    alt: ''},
{name: 'Egypt Daylight Time',             offset: 2,    alt: ''},
{name: 'Syria Daylight Time',             offset: 2,    alt: ''},
{name: 'E. Europe Daylight Time',         offset: 2,    alt: ''},
{name: 'South Africa Daylight Time',      offset: 2,    alt: ''},
{name: 'FLE Daylight Time',               offset: 2,    alt: ''},
{name: 'Turkey Daylight Time',            offset: 2,    alt: ''},
{name: 'Jerusalem Daylight Time',         offset: 2,    alt: ''},
{name: 'Russia TZ 1 Daylight Time',       offset: 2,    alt: ''},
{name: 'Libya Daylight Time',             offset: 2,    alt: ''},
{name: 'Arabic Daylight Time',            offset: 3,    alt: ''},
{name: 'Arab Daylight Time',              offset: 3,    alt: ''},
{name: 'Belarus Daylight Time',           offset: 3,    alt: ''},
{name: 'Russia TZ 2 Daylight Time',       offset: 3,    alt: ''},
{name: 'E. Africa Daylight Time',         offset: 3,    alt: ''},
{name: 'Iran Daylight Time',              offset: 3.5,  alt: ''},
{name: 'Arabian Daylight Time',           offset: 4,    alt: ''},
{name: 'Azerbaijan Daylight Time',        offset: 4,    alt: ''},
{name: 'Russia TZ 3 Daylight Time',       offset: 4,    alt: ''},
{name: 'Mauritius Daylight Time',         offset: 4,    alt: ''},
{name: 'Georgian Daylight Time',          offset: 4,    alt: ''},
{name: 'Caucasus Daylight Time',          offset: 4,    alt: ''},
{name: 'Afghanistan Daylight Time',       offset: 4.5,  alt: ''},
{name: 'West Asia Daylight Time',         offset: 5,    alt: ''},
{name: 'Russia TZ 4 Daylight Time',       offset: 5,    alt: ''},
{name: 'Pakistan Daylight Time',          offset: 5,    alt: ''},
{name: 'India Daylight Time',             offset: 5.5,  alt: ''},
{name: 'Sri Lanka Daylight Time',         offset: 5.5,  alt: ''},
{name: 'Nepal Daylight Time',             offset: 5.75, alt: ''},
{name: 'Central Asia Daylight Time',      offset: 6,    alt: ''},
{name: 'Bangladesh Daylight Time',        offset: 6,    alt: ''},
{name: 'Russia TZ 5 Daylight Time',       offset: 6,    alt: ''},
{name: 'Myanmar Daylight Time',           offset: 6.5,  alt: ''},
{name: 'SE Asia Daylight Time',           offset: 7,    alt: ''},
{name: 'Russia TZ 6 Daylight Time',       offset: 7,    alt: ''},
{name: 'China Daylight Time',             offset: 8,    alt: ''},
{name: 'Russia TZ 7 Daylight Time',       offset: 8,    alt: ''},
{name: 'Malay Peninsula Daylight Time',   offset: 8,    alt: ''},
{name: 'W. Australia Daylight Time',      offset: 8,    alt: ''},
{name: 'Taipei Daylight Time',            offset: 8,    alt: ''},
{name: 'Ulaanbaatar Daylight Time',       offset: 8,    alt: ''},
{name: 'Tokyo Daylight Time',             offset: 9,    alt: ''},
{name: 'Korea Daylight Time',             offset: 9,    alt: ''},
{name: 'Russia TZ 8 Daylight Time',       offset: 9,    alt: ''},
{name: 'Cen. Australia Daylight Time',    offset: 9.5,  alt: ''},
{name: 'AUS Central Daylight Time',       offset: 9.5,  alt: ''},
{name: 'E. Australia Daylight Time',      offset: 10,   alt: ''},
{name: 'AUS Eastern Daylight Time',       offset: 10,   alt: ''},
{name: 'West Pacific Daylight Time',      offset: 10,   alt: ''},
{name: 'Tasmania Daylight Time',          offset: 10,   alt: ''},
{name: 'Magadan Daylight Time',           offset: 10,   alt: ''},
{name: 'Russia TZ 9 Daylight Time',       offset: 10,   alt: ''},
{name: 'Russia TZ 10 Daylight Time',      offset: 11,   alt: ''},
{name: 'Central Pacific Daylight Time',   offset: 11,   alt: ''},
{name: 'Russia TZ 11 Daylight Time',      offset: 12,   alt: ''},
{name: 'New Zealand Daylight Time',       offset: 12,   alt: ''},
{name: 'UTC+12',                          offset: 12,   alt: ''},
{name: 'Fiji Daylight Time',              offset: 12,   alt: ''},
{name: 'Kamchatka Daylight Time',         offset: 12,   alt: ''},
{name: 'Tonga Daylight Time',             offset: 13,   alt: ''},
{name: 'Samoa Daylight Time',             offset: 13,   alt: ''},
{name: 'Line Islands Daylight Time',      offset: 14,   alt: ''}
]

1 ответ

Решение

Улучшенный ответ

Функциональность, описанная в моем первоначальном ответе (ниже), теперь доступна в моей библиотеке TimeZoneConverter для.NET. Вся тяжелая работа сделана для вас, и она постоянно обновляется с изменениями часовых поясов мира. Примеры в файле readme проекта показывают, как преобразовать идентификаторы Windows, IANA и Rails.

Поскольку приложение, описанное в этом вопросе, находится в Rails, я предлагаю запустить фоновое задание в.NET, чтобы преобразовать идентификаторы часовых поясов Windows в те, которые необходимы в вашем приложении Rails, и сохранить их в отдельном столбце.


Оригинальный ответ

Ресурс, который вы ищете, - это файл сопоставления Windows и IANA, который поддерживается как часть проекта Unicode CLDR. Файл находится в версии CLDR по адресу common/supplemental/windowsZones.xmlи вы можете найти текущую "версию для разработки" здесь.

Помните о нескольких вещах:

  • Файл действительно обновляется по мере появления новых часовых поясов от Microsoft и IANA или иногда, когда правительства изменяют свои правила часовых поясов настолько значительно, что применяется другое сопоставление.

  • Смещения в вашем списке будут просто стандартным смещением, то есть тем, которое применяется, когда летнее время не действует. "Часовой пояс" состоит из стандартных смещений, смещений дневного света и конкретных дат и времени переходов DST, а также истории изменений смещений и переходов.

  • Имена часовых поясов Rails не должны использоваться нигде за пределами Rails. Насколько я понимаю, они были созданы до того, как Rails решил использовать стандартные часовые пояса IANA / Olson, а затем, когда камень Ruby tzinfo стал жизнеспособным, зоны Rails были модернизированы черезMAPPINGконстанта, показанная на этой странице, затем некоторые из них были добавлены после появления индивидуальных жалоб. Если возможно, просто используйте часовые пояса IANA напрямую через гем tzinfo. Если нет, то у вас будет два уровня отображения (Microsoft -> IANA -> Rails).

  • Я не знаю специфичной для Rails реализации отображений CLDR. Я проверил несколько CLDR для Rails-проектов и обнаружил, что они не включают эту конкретную часть CLDR. Однако, если у вас есть контроль над аспектами Windows, вы можете рассмотреть возможность использования.NET-реализации, которую я опишу в этом ответе. Вы должны выполнить преобразование Windows в IANA на стороне Windows, а затем либо использовать зоны IANA непосредственно с tzinfo, либо отобразить зоны Rails в своем приложении Rails.

  • Также следует понимать, что количество часовых поясов Rails значительно меньше, чем поддерживаемых IANA. Я не проверял, но вполне вероятно, что некоторые из зон Windows отображаются на зоны IANA, которые отсутствуют в Rails. Кроме того, есть некоторые зоны Rails, которые имеют несколько записей Rails, но только одно сопоставление IANA - по сути, делая их эквивалентными псевдонимами.

  • И Rails, и Windows используют "UTC" в качестве идентификатора зоны, который Rails отображается на "Etc/UTC", а CLDR - на "Etc/GMT". Вам придется справиться с этим вручную.

  • Наконец, следует признать, что CLDR использует "стабильные" идентификаторы не так, как "канонические" идентификаторы IANA, что может вызвать некоторые трудности во время отображения.

    • В качестве примера рассмотрим, что зона Microsoft "Стандартное время Индии" отображается в "Азия / Калькутта" в CLDR, потому что это была первоначальная зона IANA. Однако IANA изменила зону на "Азия / Калькутта" и установила ссылку для обратной совместимости для "Азия / Калькутта". Когда вы смотрите в RailsMAPPINGпостоянные, есть четыре зоны Rails, "Ченнай", "Калькутта", "Мумбаи" и "Нью-Дели" - все они сопоставлены с "Азия / Калькутта".

    • Чтобы преодолеть это, вам также понадобится еще один файл из CLDR,common/bcp47/timezone.xml, Вы можете использовать этот файл, чтобы найти все ссылки между псевдонимными зонами IANA, которые могут помочь вам вернуться обратно в зону Rails.

Так что да, это возможно, но это не легко.;)

Я выполнил текущие сопоставления для вас, а именно:

"Windows","IANA","Rails"
"W. Central Africa Standard Time","Africa/Algiers","West Central Africa"
"Egypt Standard Time","Africa/Cairo","Cairo"
"Morocco Standard Time","Africa/Casablanca","Casablanca"
"South Africa Standard Time","Africa/Harare","Harare"
"South Africa Standard Time","Africa/Johannesburg","Pretoria"
"Greenwich Standard Time","Africa/Monrovia","Monrovia"
"E. Africa Standard Time","Africa/Nairobi","Nairobi"
"Argentina Standard Time","America/Argentina/Buenos_Aires","Buenos Aires"
"SA Pacific Standard Time","America/Bogota","Bogota"
"Venezuela Standard Time","America/Caracas","Caracas"
"Central Standard Time","America/Chicago","Central Time (US & Canada)"
"Mountain Standard Time (Mexico)","America/Chihuahua","Chihuahua"
"Mountain Standard Time","America/Denver","Mountain Time (US & Canada)"
"Greenland Standard Time","America/Godthab","Greenland"
"Central America Standard Time","America/Guatemala","Central America"
"SA Western Standard Time","America/Guyana","Georgetown"
"Atlantic Standard Time","America/Halifax","Atlantic Time (Canada)"
"US Eastern Standard Time","America/Indiana/Indianapolis","Indiana (East)"
"Alaskan Standard Time","America/Juneau","Alaska"
"SA Western Standard Time","America/La_Paz","La Paz"
"SA Pacific Standard Time","America/Lima","Lima"
"SA Pacific Standard Time","America/Lima","Quito"
"Pacific Standard Time","America/Los_Angeles","Pacific Time (US & Canada)"
"Mountain Standard Time (Mexico)","America/Mazatlan","Mazatlan"
"Central Standard Time (Mexico)","America/Mexico_City","Guadalajara"
"Central Standard Time (Mexico)","America/Mexico_City","Mexico City"
"Central Standard Time (Mexico)","America/Monterrey","Monterrey"
"Montevideo Standard Time","America/Montevideo","Montevideo"
"Eastern Standard Time","America/New_York","Eastern Time (US & Canada)"
"US Mountain Standard Time","America/Phoenix","Arizona"
"Canada Central Standard Time","America/Regina","Saskatchewan"
"Pacific SA Standard Time","America/Santiago","Santiago"
"E. South America Standard Time","America/Sao_Paulo","Brasilia"
"Newfoundland Standard Time","America/St_Johns","Newfoundland"
"Pacific Standard Time","America/Tijuana","Tijuana"
"Central Asia Standard Time","Asia/Almaty","Almaty"
"Arabic Standard Time","Asia/Baghdad","Baghdad"
"Azerbaijan Standard Time","Asia/Baku","Baku"
"SE Asia Standard Time","Asia/Bangkok","Bangkok"
"SE Asia Standard Time","Asia/Bangkok","Hanoi"
"China Standard Time","Asia/Chongqing","Chongqing"
"Sri Lanka Standard Time","Asia/Colombo","Sri Jayawardenepura"
"Bangladesh Standard Time","Asia/Dhaka","Astana"
"Bangladesh Standard Time","Asia/Dhaka","Dhaka"
"China Standard Time","Asia/Hong_Kong","Hong Kong"
"North Asia East Standard Time","Asia/Irkutsk","Irkutsk"
"SE Asia Standard Time","Asia/Jakarta","Jakarta"
"Israel Standard Time","Asia/Jerusalem","Jerusalem"
"Afghanistan Standard Time","Asia/Kabul","Kabul"
"Russia Time Zone 11","Asia/Kamchatka","Kamchatka"
"Pakistan Standard Time","Asia/Karachi","Islamabad"
"Pakistan Standard Time","Asia/Karachi","Karachi"
"Nepal Standard Time","Asia/Kathmandu","Kathmandu"
"India Standard Time","Asia/Kolkata","Chennai"
"India Standard Time","Asia/Kolkata","Kolkata"
"India Standard Time","Asia/Kolkata","Mumbai"
"India Standard Time","Asia/Kolkata","New Delhi"
"North Asia Standard Time","Asia/Krasnoyarsk","Krasnoyarsk"
"Singapore Standard Time","Asia/Kuala_Lumpur","Kuala Lumpur"
"Arab Standard Time","Asia/Kuwait","Kuwait"
"Magadan Standard Time","Asia/Magadan","Magadan"
"Arabian Standard Time","Asia/Muscat","Abu Dhabi"
"Arabian Standard Time","Asia/Muscat","Muscat"
"N. Central Asia Standard Time","Asia/Novosibirsk","Novosibirsk"
"Myanmar Standard Time","Asia/Rangoon","Rangoon"
"Arab Standard Time","Asia/Riyadh","Riyadh"
"Korea Standard Time","Asia/Seoul","Seoul"
"China Standard Time","Asia/Shanghai","Beijing"
"Singapore Standard Time","Asia/Singapore","Singapore"
"Russia Time Zone 10","Asia/Srednekolymsk","Srednekolymsk"
"Taipei Standard Time","Asia/Taipei","Taipei"
"West Asia Standard Time","Asia/Tashkent","Tashkent"
"Georgian Standard Time","Asia/Tbilisi","Tbilisi"
"Iran Standard Time","Asia/Tehran","Tehran"
"Tokyo Standard Time","Asia/Tokyo","Osaka"
"Tokyo Standard Time","Asia/Tokyo","Sapporo"
"Tokyo Standard Time","Asia/Tokyo","Tokyo"
"Ulaanbaatar Standard Time","Asia/Ulaanbaatar","Ulaanbaatar"
"Central Asia Standard Time","Asia/Urumqi","Urumqi"
"Vladivostok Standard Time","Asia/Vladivostok","Vladivostok"
"Yakutsk Standard Time","Asia/Yakutsk","Yakutsk"
"Ekaterinburg Standard Time","Asia/Yekaterinburg","Ekaterinburg"
"Caucasus Standard Time","Asia/Yerevan","Yerevan"
"Azores Standard Time","Atlantic/Azores","Azores"
"Cape Verde Standard Time","Atlantic/Cape_Verde","Cape Verde Is."
"UTC-02","Atlantic/South_Georgia","Mid-Atlantic"
"Cen. Australia Standard Time","Australia/Adelaide","Adelaide"
"E. Australia Standard Time","Australia/Brisbane","Brisbane"
"AUS Central Standard Time","Australia/Darwin","Darwin"
"Tasmania Standard Time","Australia/Hobart","Hobart"
"AUS Eastern Standard Time","Australia/Melbourne","Canberra"
"AUS Eastern Standard Time","Australia/Melbourne","Melbourne"
"W. Australia Standard Time","Australia/Perth","Perth"
"AUS Eastern Standard Time","Australia/Sydney","Sydney"
"UTC","Etc/UTC","UTC"
"W. Europe Standard Time","Europe/Amsterdam","Amsterdam"
"GTB Standard Time","Europe/Athens","Athens"
"Central Europe Standard Time","Europe/Belgrade","Belgrade"
"W. Europe Standard Time","Europe/Berlin","Berlin"
"W. Europe Standard Time","Europe/Berlin","Bern"
"Central Europe Standard Time","Europe/Bratislava","Bratislava"
"Romance Standard Time","Europe/Brussels","Brussels"
"GTB Standard Time","Europe/Bucharest","Bucharest"
"Central Europe Standard Time","Europe/Budapest","Budapest"
"Romance Standard Time","Europe/Copenhagen","Copenhagen"
"GMT Standard Time","Europe/Dublin","Dublin"
"FLE Standard Time","Europe/Helsinki","Helsinki"
"Turkey Standard Time","Europe/Istanbul","Istanbul"
"Kaliningrad Standard Time","Europe/Kaliningrad","Kaliningrad"
"FLE Standard Time","Europe/Kiev","Kyiv"
"GMT Standard Time","Europe/Lisbon","Lisbon"
"Central Europe Standard Time","Europe/Ljubljana","Ljubljana"
"GMT Standard Time","Europe/London","Edinburgh"
"GMT Standard Time","Europe/London","London"
"Romance Standard Time","Europe/Madrid","Madrid"
"Belarus Standard Time","Europe/Minsk","Minsk"
"Russian Standard Time","Europe/Moscow","Moscow"
"Russian Standard Time","Europe/Moscow","St. Petersburg"
"Romance Standard Time","Europe/Paris","Paris"
"Central Europe Standard Time","Europe/Prague","Prague"
"FLE Standard Time","Europe/Riga","Riga"
"W. Europe Standard Time","Europe/Rome","Rome"
"Russia Time Zone 3","Europe/Samara","Samara"
"Central European Standard Time","Europe/Sarajevo","Sarajevo"
"Central European Standard Time","Europe/Skopje","Skopje"
"FLE Standard Time","Europe/Sofia","Sofia"
"W. Europe Standard Time","Europe/Stockholm","Stockholm"
"FLE Standard Time","Europe/Tallinn","Tallinn"
"W. Europe Standard Time","Europe/Vienna","Vienna"
"FLE Standard Time","Europe/Vilnius","Vilnius"
"Russian Standard Time","Europe/Volgograd","Volgograd"
"Central European Standard Time","Europe/Warsaw","Warsaw"
"Central European Standard Time","Europe/Zagreb","Zagreb"
"Samoa Standard Time","Pacific/Apia","Samoa"
"New Zealand Standard Time","Pacific/Auckland","Auckland"
"New Zealand Standard Time","Pacific/Auckland","Wellington"
"Tonga Standard Time","Pacific/Fakaofo","Tokelau Is."
"Fiji Standard Time","Pacific/Fiji","Fiji"
"Central Pacific Standard Time","Pacific/Guadalcanal","Solomon Is."
"West Pacific Standard Time","Pacific/Guam","Guam"
"Hawaiian Standard Time","Pacific/Honolulu","Hawaii"
"UTC+12","Pacific/Majuro","Marshall Is."
"UTC-11","Pacific/Midway","International Date Line West"
"UTC-11","Pacific/Midway","Midway Island"
"Central Pacific Standard Time","Pacific/Noumea","New Caledonia"
"UTC-11","Pacific/Pago_Pago","American Samoa"
"West Pacific Standard Time","Pacific/Port_Moresby","Port Moresby"
"Tonga Standard Time","Pacific/Tongatapu","Nuku'alofa"

Обратите внимание, что приведенный выше список содержит записи, в которых более одной зоны Rails отображается обратно в одну и ту же зону Windows. Вы можете выбрать только один из них при отображении в направлении Windows-to-Rails.

Кроме того, вышеприведенный список не включает зоны, которые не могут быть отображены, которые являются следующими (CSV):

"Windows","IANA","Rails"
"","Pacific/Chatham","Chatham Is."
"Dateline Standard Time","Etc/GMT+12",""
"Pacific Standard Time (Mexico)","America/Santa_Isabel",""
"Eastern Standard Time (Mexico)","America/Cancun",""
"Paraguay Standard Time","America/Asuncion",""
"Central Brazilian Standard Time","America/Cuiaba",""
"SA Eastern Standard Time","America/Cayenne",""
"Bahia Standard Time","America/Bahia",""
"Namibia Standard Time","Africa/Windhoek",""
"Jordan Standard Time","Asia/Amman",""
"Middle East Standard Time","Asia/Beirut",""
"Syria Standard Time","Asia/Damascus",""
"E. Europe Standard Time","Etc/GMT-2",""
"Libya Standard Time","Africa/Tripoli",""
"Mauritius Standard Time","Indian/Mauritius",""
"Line Islands Standard Time","Pacific/Kiritimati",""

Благодаря @MattJohnson-Pint я смог решить эту проблему после очень долгого исследования, однако я использовал более простое решение.

Итак, у меня есть приложение Rails, которое должно иметь дело с файлами iCalendar, поступающими с разных почтовых серверов (в том числе Outlook), что вызывало проблему при попытке интерпретировать часовые пояса Microsoft.

Я не могу опубликовать здесь свой полный код из-за проблем с собственностью, но вот как это происходит:

1) Загружайте файл сопоставления windowsZone.xml из мастера проекта CLDR при каждом запуске программы. 2) При проверке строки часового пояса сначала проверьте часовые пояса Ruby:

ActiveSupport::TimeZone.all.any? { |tz| tz.name == tzid }

3) Затем проверьте часовой пояс IANA в геме TZInfo:

TZInfo::TimezoneProxy.all.any? { |tz| tz.identifier == tzid }

4) Если у вас есть часовой пояс Microsoft, проверьте файл сопоставления, Nokogiri::XML очень полезен.

5) В противном случае отправьте ошибку.

И это вроде нормально работает, надеюсь, я смог помочь, если кто-то столкнется с этой проблемой в 2020+:)

Другие вопросы по тегам