1. Einführung
Wenn du denkst, Zeitzonen sind einfach nur "ein paar Stunden draufrechnen oder abziehen", wirst du sehr schnell den Schmerz der meisten Programmierer auf diesem Planeten spüren. Zeitzonen, Umstellung auf Sommer-/Winterzeit, unerwartete Exceptions beim Versuch, "die Zeit in eine andere Region zu konvertieren" – all das kann zu Bugs führen, die schwer zu finden und noch schwerer den Usern zu erklären sind.
Das Schlimmste: Es gibt auf der Welt kein und es gab nie ein "universelles" Verständnis von Zeit – zum Beispiel können zwei Nachbarländer unterschiedlich mit der Sommerzeit umgehen, und manchmal werden Entscheidungen zur Umstellung mitten im Jahr getroffen (ja, das passiert wirklich!). Beispiel: 2011 hat Samoa einfach einen ganzen Tag übersprungen und die Seite der Datumsgrenze gewechselt.
Aber C# und .NET geben dir mächtige Tools, um wenigstens irgendwie damit klarzukommen. Heute lernen wir unseren Retter kennen – den Typ TimeZoneInfo und seine Funktionen, die dir und deiner App helfen werden.
Wann und warum du mit Zeitzonen arbeiten musst
- Wenn User/Server in verschiedenen Regionen der Welt sind
- Wenn du Datum und Zeit in der Datenbank in UTC speicherst, aber dem User in seiner lokalen Zeit anzeigen willst
- Für die Berechnung von Zeitplänen, Erinnerungen, Online-Events ("Das Webinar startet um 19:00 Uhr in Berlin – und in deiner Region?")
- Bei der Entwicklung von Unternehmens-/globalen Systemen (z.B. Buchhaltung oder CRM für internationale Unternehmen)
Überblick über den Typ TimeZoneInfo
TimeZoneInfo ist eine speziell in .NET gebaute Klasse, die Infos über eine Zeitzone repräsentiert: ihr Offset zu UTC, Name, Unterstützung für Sommerzeit und so weiter.
Im Gegensatz zur veralteten Klasse TimeZone, die nur "lokale" und "UTC" Zeitzonen kennt, gibt dir TimeZoneInfo vollen Zugriff auf alle Zeitzonen, die im System registriert sind (und sogar auf eigene, die du manuell erstellst).
2. Zeitzonen-Infos abrufen
Lokale und UTC-Zonen
Die Infos zur lokalen Zeitzone bekommst du super easy:
// Lokal (also da, wo dein Programm gerade läuft)
TimeZoneInfo local = TimeZoneInfo.Local;
// Immer UTC
TimeZoneInfo utc = TimeZoneInfo.Utc;
Console.WriteLine(local.DisplayName); // Zum Beispiel: (UTC+01:00) Berlin, Vienna
Console.WriteLine(utc.DisplayName); // (UTC) Coordinated Universal Time
Alle verfügbaren Zeitzonen
Oft willst du dem User eine Liste aller möglichen Zeitzonen zeigen (z.B. bei der Registrierung):
foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
{
Console.WriteLine($"{tz.Id} | {tz.DisplayName}");
}
Das gibt dir eine Liste wie:
- Central European Standard Time | (UTC+01:00) Berlin, Vienna
- Pacific Standard Time | (UTC-08:00) Pacific Time (US & Canada)
- usw.
Visualisierung: wichtigste Eigenschaften von TimeZoneInfo
| Eigenschaft | Beschreibung |
|---|---|
|
Systeminterner Bezeichner der Zeitzone (wird für die Suche verwendet) |
|
Anzeige für den User (mit Uhrzeit und Städten) |
|
Name der "normalen" Zeit |
|
Name der Zeit für die Sommerzeit-Umstellung |
|
Offset zu UTC (z.B. +01:00 für Berlin) |
|
True, wenn die Zeitzone Sommer-/Winterzeit unterstützt |
3. Zeit zwischen Zeitzonen konvertieren
Genau darum geht's! Du willst:
- Zeit von einer Zone in eine andere umrechnen (z.B. Server speichert in UTC, aber du zeigst dem User seine lokale Zeit)
- Die Umstellung auf Sommer-/Winterzeit korrekt behandeln
Allgemeine Syntax
DateTime utcNow = DateTime.UtcNow;
// Zum Beispiel: Wir rechnen diese Zeit in die zentraleuropäische Zeitzone um
TimeZoneInfo europeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
DateTime europeTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, europeZone);
Console.WriteLine($"UTC now: {utcNow}"); // 2024-06-20 10:30:00
Console.WriteLine($"Europe now: {europeTime}"); // 2024-06-20 11:30:00
Wichtig: Nutze für interne Berechnungen und Speicherung immer UTC und konvertiere erst "am Ausgang" in die gewünschte Zone!
Wie finde ich den Zeitzonen-Bezeichner?
Unter Windows sind die Bezeichner (Id) von Zeitzonen spezifisch (z.B. "Central European Standard Time"), unter Linux/Unix sind es meist IANA/Olson-Bezeichner ("Europe/Berlin", "America/New_York").
Die Liste der Bezeichner auf deinem System bekommst du mit TimeZoneInfo.GetSystemTimeZones().
4. Konvertierung zwischen beliebigen Zonen
Angenommen, du hast eine Zeit in London (GMT/UTC+0) und willst sie nach Tokio (UTC+9) umrechnen:
DateTime londonTime = new DateTime(2024, 6, 20, 12, 0, 0, DateTimeKind.Unspecified);
TimeZoneInfo londonZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
TimeZoneInfo tokyoZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
// Schritt 1: Zeit in UTC umrechnen (falls sie lokal ist)
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(londonTime, londonZone);
// Schritt 2: UTC nach Tokio-Zeit umrechnen
DateTime tokyoTime = TimeZoneInfo.ConvertTimeFromUtc(utc, tokyoZone);
Console.WriteLine($"London: {londonTime} | UTC: {utc} | Tokyo: {tokyoTime}");
Umgang mit Sommer- und Winterzeit
TimeZoneInfo berücksichtigt die Umstellung auf Sommer-/Winterzeit – falls die Zone das unterstützt.
TimeZoneInfo eastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime dateWinter = new DateTime(2024, 1, 1, 12, 0, 0, DateTimeKind.Unspecified);
DateTime dateSummer = new DateTime(2024, 7, 1, 12, 0, 0, DateTimeKind.Unspecified);
Console.WriteLine( TimeZoneInfo.ConvertTimeToUtc(dateWinter, eastern)); // Offset UTC-5
Console.WriteLine( TimeZoneInfo.ConvertTimeToUtc(dateSummer, eastern)); // Offset UTC-4 – Sommerzeit!
Selbst wenn die USA (wie im Beispiel oben) die Sommerzeit abschaffen (solche Initiativen gibt's jedes Jahr!), wird die Zeitzonen-Datenbank deines OS trotzdem aktualisiert und dein Code läuft korrekt weiter.
5. Praktische Tipps und häufige Fehler
Exceptions und Stolperfallen
- An Stellen, wo die Uhr umgestellt wird (z.B. 2:30 Uhr in der Nacht der Zeitumstellung), können manche Zeiten "nicht existieren" oder "doppelt vorkommen":
Zum Beispiel: Am Tag der Umstellung "zurück" gibt es 2:30 Uhr zweimal – und beide Male sind unterschiedlich. - Vergiss nicht: Die Liste der Zeitzonen kann sich durch OS-Updates ändern! Beispiel: Manche Länder schaffen die Sommerzeit ab oder führen sie ein.
GO TO FULL VERSION