Come tradurre tra i fusi orari Windows e IANA?

Come descritto nel wiki del tag timezone , ci sono due diversi stili di fusi orari.

Molte API basate su Internet utilizzano i fusi orari IANA, ma per numerosi motivi potrebbe essere necessario convertirlo in un id del fuso orario di Windows o viceversa.

Come può essere realizzato in .Net?

L’origine principale dei dati per la conversione tra identificatori di fuso orario Windows e IANA è il file windowsZones.xml , distribuito come parte del progetto CLDR Unicode .

Tuttavia , CLDR viene rilasciato solo due volte all’anno. Questo, insieme alla cadenza periodica degli aggiornamenti di Windows e agli aggiornamenti irregolari del database dei fusi orari IANA, rende complicato l’uso diretto dei dati CLDR. Tieni presente che i cambi di fuso orario vengono effettuati in base ai capricci dei vari governi del mondo e non tutte le modifiche vengono apportate con un preavviso sufficiente per inserirle 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 nuovi di tanto in tanto saltano fuori. Pertanto, ho incapsulato la complessità della soluzione nella micro-libreria TimeZoneConverter , che può essere installata da Nuget.

L’utilizzo 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 associato a un singolo fuso orario di Windows, il contrario non è vero. 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 sia in America/New_York , sia in America/Toronto . TimeZoneConverter consegnerà quello che CLDR segna con "001" , noto come “zona d’oro”, a meno che tu non specifichi specificatamente un codice paese e vi sia una corrispondenza per una zona diversa in quel paese.

Nota: questa risposta si è evoluta nel corso degli anni, pertanto i commenti riportati di seguito potrebbero non essere applicabili alla revisione corrente. Controlla la cronologia delle modifiche per i dettagli. Grazie.