La fonte primaria dei dati per la conversione tra identificatori di fuso orario Windows e IANA è il windowsZones.xml
file, distribuito come parte del progetto CLDR Unicode . L'ultima versione di sviluppo può essere trovata qui .
Tuttavia , CLDR viene rilasciato solo due volte l'anno. Questo, insieme alla cadenza periodica degli aggiornamenti di Windows e agli aggiornamenti irregolari del database dei fusi orari IANA, rende complicato l'utilizzo diretto dei dati CLDR. Tieni presente che le modifiche del fuso orario vengono apportate per capriccio dei vari governi del mondo e non tutte le modifiche vengono apportate con sufficiente preavviso per entrare in questi cicli di rilascio prima delle rispettive date di validità.
Ci sono alcuni altri casi limite che devono essere gestiti che non sono coperti rigorosamente dal CLDR e di volta in volta ne compaiono di nuovi. Pertanto, ho incapsulato la complessità della soluzione nella micro-libreria TimeZoneConverter , che può essere installata da Nuget.
L'uso di questa libreria è semplice. Ecco alcuni esempi di conversione:
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"
Ci sono altri esempi sul sito del progetto .
È importante riconoscere che mentre un fuso orario IANA può essere mappato su un singolo fuso orario di Windows, non è vero il contrario. Un singolo fuso orario di Windows potrebbe essere associato a più di un fuso orario IANA. Questo può essere visto negli esempi sopra, dove Eastern Standard Time
è mappato su entrambi America/New_York
e su America/Toronto
. TimeZoneConverter fornirà quello contrassegnato da CLDR "001"
, noto come "zona aurea", a meno che non specifichi specificatamente un codice paese e che vi sia una corrispondenza per una zona diversa in quel paese.
Nota: questa risposta si è evoluta nel corso degli anni, quindi i commenti che seguono potrebbero o meno essere applicati alla revisione attuale. Rivedi la cronologia delle modifiche per i dettagli. Grazie.
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
dàAsia/Calcutta
dovrebbe essereAsia/Kolkata
. sembra cheTzdbDateTimeZoneSource
contenga vecchi valori.