Comment traduire entre les fuseaux horaires IANA et Windows?

comme décrit dans l'étiquette de fuseau horaire wiki , il y a deux styles différents de fuseaux horaires.

  • ceux fournis par Microsoft pour utilisation avec Windows et la classe .Net TimeZoneInfo sont identifiés par une valeur telle que Eastern Standard Time .

  • ceux fournis par IANA dans la TZDB sont identifiés par une valeur telle que America/New_York .

de nombreux API basées sur Internet utilisent les fuseaux horaires IANA, mais pour de nombreuses raisons on pourrait avoir besoin de convertir ceci en un id de fuseau horaire Windows, ou vice-versa.

comment cela peut-il être accompli dans .Net?

104
demandé sur Community 2013-06-27 20:46:02

1 réponses

la source principale des données pour la conversion entre Windows et les identificateurs de fuseaux horaires IANA est le fichier windowsZones.xml , distribué dans le cadre de le projet Unicode CLDR .

Toutefois , CLDR est sorti que deux fois par an. Ceci, avec la cadence périodique des mises à jour de Windows, et les mises à jour irrégulières de la base de données IANA time zone, rend compliqué de simplement utiliser les données CLDR directement. Gardez à l'esprit que les changements de fuseaux horaires eux-mêmes sont faits au gré des divers gouvernements du monde, et que tous les changements ne sont pas faits avec un préavis suffisant pour les faire entrer dans ces cycles de diffusion avant leur date d'entrée en vigueur respective.

il y a quelques autres cas de bordures qui doivent être manipulés qui ne sont pas strictement couverts par le CLDR, et de nouveaux surgissent de temps en temps. Par conséquent, j'ai encapsulé la complexité de la solution dans le TimeZoneConverter micro-bibliothèque, qui peut être installé à partir de Nuget.

utiliser cette bibliothèque est simple. Voici quelques exemples de conversion:

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"

il y a d'autres exemples sur le site du projet .

il est important de reconnaître que même si un fuseau horaire IANA peut être mappé à un seul fuseau horaire Windows, l'inverse n'est pas vrai. Un seul fuseau horaire Windows peut être mappé à plus D'une fois IANA zone. Cela se voit dans les exemples ci-dessus, où Eastern Standard Time est mappé à la fois America/New_York , et à America/Toronto . TimeZoneConverter délivrera celui que CLDR marque avec "001" , connu comme la "zone d'or", à moins que vous ne fournissiez spécifiquement un code de pays et il ya une correspondance pour une zone différente dans ce pays.

Note: Cette réponse a évolué au fil des ans, de sorte que les commentaires ci-dessous peuvent s'appliquer ou non à la révision actuelle. Examen de la modifier historique pour plus de détails. Grâce.

139
répondu Matt Johnson 2018-04-27 20:36:04