DateTime oder DateTimeOffset in C#: Vollständiger Leitfaden für Entwickler

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum bereiten Ihnen Daten Kopfschmerzen?

Wenn Sie jemals Code in C# geschrieben haben und vor der Aufgabe standen, ein Datum und eine Uhrzeit zwischen einem Server in Moskau und einem Client in New York zu übertragen, sind Ihnen sicherlich seltsame Fehler aufgefallen: „Warum ist es bei mir morgen?“, „Woher kommen die 3 Stunden?“ Kommt Ihnen das bekannt vor?

In .NET gibt es zwei Hauptwerkzeuge für die Arbeit mit Daten: DateTime und DateTimeOffset. Auf den ersten Blick ähneln sie sich – beide speichern Datum und Uhrzeit. Aber der Unterschied zwischen ihnen ist entscheidend, und die falsche Wahl kann zu katastrophalen Fehlern in der Geschäftslogik führen.

In diesem Tutorial analysieren wir DateTime vs DateTimeOffset anhand realer Beispiele, verstehen, wann was zu verwenden ist, und vergessen für immer die Verwirrung mit Zeitzonen. Los geht's!



Was ist DateTime? (Und warum es eine Falle ist)

DateTime ist eine Struktur, die Datum und Uhrzeit speichert. Sie existiert in .NET seit der ersten Version. Aber sie hat eine Besonderheit: Sie speichert keine Informationen über die Zeitzone. Genauer gesagt, speichert sie sie, aber nur in Form eines Flags Kind:

  • DateTimeKind.Unspecified – Zeitzone nicht angegeben (Standard).
  • DateTimeKind.Utc – UTC-Zeit.
  • DateTimeKind.Local – Lokale Systemzeit.

Das Problem ist, dass dieses Flag nur eine Information ist. Es konvertiert die Zeit nicht automatisch. Stellen Sie sich vor, Sie speichern in einer Datenbank ein DateTime mit Kind = Local auf einem Server in Moskau. Später lesen Sie dieses Datum auf einem Server in Wladiwostok aus. Was passiert? Richtig – das Programm sieht, dass Kind = Local ist, und nimmt an, dass es sich um die Ortszeit von Wladiwostok handelt. In Wirklichkeit ist es aber Moskauer Zeit. Eine absolute Katastrophe.



// Beispiel für ein Problem mit DateTimeDateTime moscowTime = new DateTime(2025, 3, 15, 14, 0, 0, DateTimeKind.Local);Console.WriteLine(moscowTime); // 15.03.2025 14:00:00 (angenommen, es ist MSK)

// Wenn dieser Code auf einem Server mit der Zeitzone UTC+10 (Wladiwostok) ausgeführt wird// wird DateTime als Ortszeit von Wladiwostok interpretiert!// Dies führt zu einem Fehler von 7 Stunden.


Was ist DateTimeOffset? (Der Retter der Entwickler)

DateTimeOffset ist eine intelligentere Struktur, die in .NET Framework 3.5 eingeführt wurde. Sie speichert Datum, Uhrzeit und die Abweichung von UTC (Offset). Die Abweichung ist die Anzahl der Stunden und Minuten, um die Ihre Ortszeit von UTC abweicht.

Zum Beispiel: 2025-03-15 14:00:00 +03:00 – das ist die Zeit in Moskau (UTC+3). Wenn Sie diesen Wert an einen Server in Wladiwostok (UTC+10) übergeben, versteht .NET: „Aha, das ist +03, also UTC = 11:00. Jetzt kann ich es leicht in die Ortszeit umrechnen: 21:00.“ Keine Magie – reine Mathematik.



// Beispiel mit DateTimeOffsetDateTimeOffset moscowOffset = new DateTimeOffset(2025, 3, 15, 14, 0, 0, TimeSpan.FromHours(3));Console.WriteLine(moscowOffset); // 15.03.2025 14:00:00 +03:00

// Jetzt, selbst auf einem Server in Wladiwostok, kennen wir die genaue Abweichung// und können die Zeit korrekt für den Benutzer anzeigen


Wesentliche Unterschiede: DateTime vs DateTimeOffset

Fassen wir alles in einer übersichtlichen Tabelle zusammen. Dies hilft Ihnen, schnell zu verstehen, was Sie in einer bestimmten Situation wählen sollten.



1. Speicherung von Zeitzoneninformationen

  • DateTime: Speichert nur das Flag Kind (Unspecified, Utc, Local). Speichert nicht die Abweichung selbst.
  • DateTimeOffset: Speichert die genaue Abweichung von UTC (z. B. +03:00, -05:00).


2. Vergleich von Werten

  • DateTime: Vergleicht nach dem „nackten“ Wert. Wenn Sie 10:00 UTC und 10:00 MSK (UTC+3) haben, dann sagt DateTime.Equals(), dass sie gleich sind. Obwohl es sich tatsächlich um unterschiedliche Zeitpunkte handelt.
  • DateTimeOffset: Vergleicht nach dem Zeitpunkt (UTC). 10:00 UTC und 13:00 MSK sind

Blogs

Buchempfehlungen