CodeGym /Kurse /C# SELF /Arbeiten mit Zeitzonen: T...

Arbeiten mit Zeitzonen: TimeZoneInfo

C# SELF
Level 15 , Lektion 2
Verfügbar

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
Id
Systeminterner Bezeichner der Zeitzone (wird für die Suche verwendet)
DisplayName
Anzeige für den User (mit Uhrzeit und Städten)
StandardName
Name der "normalen" Zeit
DaylightName
Name der Zeit für die Sommerzeit-Umstellung
BaseUtcOffset
Offset zu UTC (z.B. +01:00 für Berlin)
SupportsDaylightSavingTime
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.
2
Aufgabe
C# SELF, Level 15, Lektion 2
Gesperrt
Anzeige der lokalen und UTC-Zeitzone
Anzeige der lokalen und UTC-Zeitzone
2
Aufgabe
C# SELF, Level 15, Lektion 2
Gesperrt
Zeitumrechnung zwischen zwei Zeitzonen
Zeitumrechnung zwischen zwei Zeitzonen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION