Die Hauptquelle für die Daten zur Konvertierung zwischen Windows- und IANA-Zeitzonen-IDs ist die windowsZones.xml
Datei, die im Rahmen des Unicode CLDR- Projekts verteilt wird. Die neueste Entwicklerversion finden Sie hier .
Allerdings wird CLDR nur zweimal jährlich veröffentlicht. Dies, zusammen mit der periodischen Trittfrequenz von Windows-Updates und den unregelmäßigen Updates der IANA-Zeitzonendatenbank, macht es kompliziert, nur die CLDR-Daten direkt zu verwenden. Beachten Sie, dass Zeitzonenänderungen selbst nach Lust und Laune der verschiedenen Regierungen der Welt vorgenommen werden und nicht alle Änderungen mit ausreichender Ankündigung vorgenommen werden, um in diese Veröffentlichungszyklen vor ihrem jeweiligen Inkrafttreten zu gelangen.
Es müssen einige andere Randfälle behandelt werden, die nicht ausschließlich von der CLDR abgedeckt werden, und von Zeit zu Zeit tauchen neue auf. Daher habe ich die Komplexität der Lösung in die TimeZoneConverter -Mikrobibliothek eingekapselt, die von Nuget aus installiert werden kann.
Die Verwendung dieser Bibliothek ist einfach. Hier einige Beispiele für die Konvertierung:
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"
Weitere Beispiele finden Sie auf der Projektseite .
Es ist wichtig zu erkennen, dass eine IANA-Zeitzone zwar einer einzelnen Windows-Zeitzone zugeordnet werden kann, das Gegenteil jedoch nicht der Fall ist. Eine einzelne Windows-Zeitzone kann mehreren IANA-Zeitzonen zugeordnet sein. Dies ist in den obigen Beispielen zu sehen, in denen Eastern Standard Time
sowohl auf America/New_York
als auch auf abgebildet ist America/Toronto
. TimeZoneConverter liefert diejenige, mit der CLDR markiert ist "001"
, die als "goldene Zone" bezeichnet wird, es sei denn, Sie geben speziell einen Ländercode an und es gibt eine Übereinstimmung für eine andere Zone in diesem Land.
Hinweis: Diese Antwort hat sich im Laufe der Jahre weiterentwickelt, sodass die folgenden Kommentare möglicherweise für die aktuelle Version gelten oder nicht. Überprüfen Sie den Bearbeitungsverlauf auf Details. Vielen Dank.
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
gibtAsia/Calcutta
es sein sollteAsia/Kolkata
. es scheint, als ob dasTzdbDateTimeZoneSource
alte Werte enthält.Asia/Kolkata
using-IanaToWindows
Methode schlägt dies fehl. aber es funktioniert mitAsia/Calcutta
dem alten Namen. Sie haben die Methode aktualisiert, habenWindowsToIana
aberIanaToWindows
auch das gleiche Problem. einige andere Zonen , die nicht berufstätig sind sindAmerica/Argentina/Buenos_Aires
,America/Indiana/Indianapolis
,Asia/Kathmandu
.IanaToWindows
Methode zum Ausgleich bearbeitet . Vielen Dank!var canonical = tzdbSource.CanonicalIdMap[ ianaZoneId ]; links = Enumerable.Repeat( canonical, 1 ).Concat( links );
hat mir auch geholfen.Ich weiß, dass dies eine alte Frage ist, aber ich hatte einen Anwendungsfall, den ich hier teilen möchte, da dies der relevanteste Beitrag ist, den ich bei der Suche gefunden habe. Ich habe eine .NET Core-App mit einem Docker-Linux-Container entwickelt, aber für die Bereitstellung auf einem Windows-Server. Daher brauchte ich nur meinen Docker-Linux-Container, um die Windows-Zeitzonennamen zu unterstützen. Ich habe dies zum Laufen gebracht, ohne meinen Anwendungscode zu ändern, indem ich Folgendes getan habe:
In meinem .NET-Code funktionierte Folgendes wie folgt:
TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
quelle
America/Phoenix
to"US Mountain Standard Time"
,Pacific/Honolulu
to"Hawaiian Standard Time"
,America/Anchorage
to"Alaskan Standard Time"
undAmerica/Adak
to hinzufügen"Aleutian Standard Time"
. Das deckt keine US-Territorien oder historischen Diskrepanzen ab, aber es wird Ihnen den Einstieg erleichtern.