Основним джерелом даних для перетворення між ідентифікаторами часового поясу Windows та IANA є windowsZones.xml
файл, розповсюджений як частина проекту CLIC Unicode . Останню версію розробника можна знайти тут .
Однак 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
містить старі значення.