Wie verwandelt man DateTime in eine ISO 8601-Zeichenfolge in C#? Ein Problem, das selbst erfahrene Entwickler plagt
\n\nHaben 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.
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\nWas ist ISO 8601 und warum ist es wichtig?
\n\nISO 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
- 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
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\nDer einfachste Weg: DateTime.ToString() mit dem Format "o"
\n\nIn 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\nDateTime now = DateTime.Now;\nstring isoString = now.ToString("o");\nConsole.WriteLine(isoString);\n// Beispielausgabe: 2023-12-25T14:30:00.1234567+03:00\n\nDies 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.
Wie erhält man ISO 8601 ohne Millisekunden?
\n\nManchmal werden Millisekunden (oder sogar Ticks) nicht benötigt. Zum Beispiel für Logs oder einfache Daten. Verwenden Sie ein benutzerdefiniertes Format:
\n\nDateTime now = DateTime.UtcNow;\nstring isoShort = now.ToString("yyyy-MM-ddTHH:mm:ssK");\nConsole.WriteLine(isoShort);\n// Beispiel: 2023-12-25T14:30:00Z\n\nHier ist K der Spezifizierer für die Zeitzone. Für UTC ergibt er Z, für lokale Zeit den Offset.
Das Problem mit Zeitzonen: DateTime vs DateTimeOffset
\n\nDer 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\nDateTimeOffset nowOffset = DateTimeOffset.Now;\nstring isoOffset = nowOffset.ToString("o");\nConsole.WriteLine(isoOffset);\n// Beispiel: 2023-12-25T14:30:00.1234567+03:00\n\nWenn Sie jedoch mit DateTime arbeiten, überprüfen Sie immer dessen Eigenschaft Kind:
- \n
DateTimeKind.Utc– ergibtZam Ende. \n DateTimeKind.Local– ergibt den lokalen Offset (z. B. +03:00). \n DateTimeKind.Unspecified– ergibt gar nichts