DateTime im ISO 8601-Format in C#: Vollständige Anleitung mit Antworten auf häufige Fragen

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

Wie verwandelt man DateTime in eine ISO 8601-Zeichenfolge in C#? Ein Problem, das selbst erfahrene Entwickler plagt

\n\n

Haben Sie jemals die Situation erlebt, dass Ihre API ein Datum im Format "2023-01-15T10:30:00" zurückgibt, der Client es aber nicht versteht? Oder umgekehrt, Sie erhalten ein Datum von einem externen Dienst, das wie "2023-01-15T10:30:00+03:00" aussieht, und Ihr Parser bricht zusammen? Kommt Ihnen bekannt vor? Wenn Sie mit C# und dem Objekt DateTime arbeiten, dann ist die Frage, wie man einen ISO 8601-String erhält, ein Klassiker. Auf Stack Overflow hat diese Frage tausende Aufrufe, und das zu Recht. Heute werden wir ein für alle Mal klären, wie man DateTime korrekt in eine Zeichenfolge im ISO 8601-Format umwandelt und dabei typische Fallstricke vermeidet.

\n\n

Wir zeigen nicht nur ein paar Codezeilen. Wir werden das C# DateTime-Format für ISO 8601 analysieren, die Arbeit mit Zeitzonen und Millisekunden betrachten und die häufigsten Fragen beantworten. Los geht's!

\n\n

Was ist ISO 8601 und warum ist es wichtig?

\n\n

ISO 8601 ist ein internationaler Standard für die Darstellung von Datum und Uhrzeit. Er sieht so aus: 2023-12-25T14:30:00.0000000+03:00. Die wichtigsten Merkmale sind:

\n
    \n
  • Trennzeichen T zwischen Datum und Uhrzeit.
  • \n
  • Zeitzone wird am Ende angegeben (Z für UTC oder Offset wie +05:00).
  • \n
  • Bruchteile von Sekunden (Millisekunden, Ticks).
  • \n
\n

Wozu braucht man das? JSON, XML, REST-API, Datenbanken – überall dort, wo eine eindeutige Übertragung eines Zeitpunkts ohne Bindung an die lokale Kultur des Servers erforderlich ist. Ein falsches Format – und Ihr Parser auf der anderen Seite könnte die Stunden verwerfen oder Tag und Monat verwechseln. Daher ist das Datumsformat ISO 8601 C# eine Muss-Fähigkeit für jeden Backend-Entwickler.

\n\n

Der einfachste Weg: DateTime.ToString() mit dem Format "o"

\n\n

In C# gibt es einen integrierten Formatspezifizierer für das Roundtrip-Format – den Buchstaben "o" (Kleinbuchstabe). Er liefert eine vollständige ISO 8601-Zeichenfolge mit maximaler Genauigkeit.

\n\n
DateTime now = DateTime.Now;\nstring isoString = now.ToString("o");\nConsole.WriteLine(isoString);\n// Beispielausgabe: 2023-12-25T14:30:00.1234567+03:00
\n\n

Dies ist der einfachste Weg, um einen ISO 8601-String in C# zu erhalten. Es gibt jedoch einen Haken: Wenn Ihr DateTime den Kind = Unspecified hat, wird am Ende der Zeichenfolge keine Zeitzone angegeben. Dies kann für strenge Parser ein Problem sein. Die Lösung ist, immer DateTimeOffset zu verwenden oder den Kind explizit festzulegen.

\n\n

Wie erhält man ISO 8601 ohne Millisekunden?

\n\n

Manchmal werden Millisekunden (oder sogar Ticks) nicht benötigt. Zum Beispiel für Logs oder einfache Daten. Verwenden Sie ein benutzerdefiniertes Format:

\n\n
DateTime now = DateTime.UtcNow;\nstring isoShort = now.ToString("yyyy-MM-ddTHH:mm:ssK");\nConsole.WriteLine(isoShort);\n// Beispiel: 2023-12-25T14:30:00Z
\n\n

Hier ist K der Spezifizierer für die Zeitzone. Für UTC ergibt er Z, für lokale Zeit den Offset.

\n\n

Das Problem mit Zeitzonen: DateTime vs DateTimeOffset

\n\n

Der größte Schmerzpunkt für Entwickler ist die Verwirrung zwischen DateTime und DateTimeOffset. Wenn Sie ein ISO 8601-Datum in C# erhalten möchten, das auf der ganzen Welt eindeutig interpretiert wird, verwenden Sie DateTimeOffset. Es enthält immer den Offset von UTC.

\n\n
DateTimeOffset nowOffset = DateTimeOffset.Now;\nstring isoOffset = nowOffset.ToString("o");\nConsole.WriteLine(isoOffset);\n// Beispiel: 2023-12-25T14:30:00.1234567+03:00
\n\n

Wenn Sie jedoch mit DateTime arbeiten, überprüfen Sie immer dessen Eigenschaft Kind:

\n
    \n
  • DateTimeKind.Utc – ergibt Z am Ende.
  • \n
  • DateTimeKind.Local – ergibt den lokalen Offset (z. B. +03:00).
  • \n
  • DateTimeKind.Unspecified – ergibt gar nichts

Blogs

Buchempfehlungen