RFC 3339 in Go: 5 Fehler beim Parsen von Datumsangaben und wie man sie behebt

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

Parsen von RFC 3339 / ISO-8601 in Go: Warum selbst erfahrene Entwickler stolpern

\n\n

Haben Sie jemals in Go so etwas wie time.Parse("2006-01-02T15:04:05Z", input) geschrieben, einen Fehler erhalten und sich gefühlt, als würde die Sprache Sie absichtlich ärgern? Kommt Ihnen bekannt vor. Das Parsen von Datums- und Zeitangaben ist eines dieser Themen, bei denen alles einfach erscheint, aber in der Praxis viele Fallstricke lauern.

\n\n

Auf Stack Overflow hat die Frage "Parsing RFC-3339 / ISO-8601 date-time string in Go" tausende Aufrufe gesammelt. Menschen verwirren sich mit Formaten, vergessen Nanosekunden, leiden unter Zeitzonen und ärgern sich über die "magische" Zahl 2006-01-02T15:04:05Z. In diesem Artikel analysieren wir die 5 häufigsten Fehler und zeigen, wie man sie ein für alle Mal vermeidet. Los geht's!

\n\n

Ein wenig Theorie: Was sind RFC 3339 und ISO 8601?

\n\n

Bevor wir in den Code eintauchen, klären wir kurz die Begriffe. ISO 8601 ist der internationale Standard für die Darstellung von Datum und Uhrzeit. RFC 3339 ist eine "abgespeckte" Version davon, die im Web weit verbreitet ist (z.B. in JSON, APIs, Logs).

\n\n

Typische RFC 3339-Strings sehen so aus:

\n\n
2025-01-15T10:30:00Z\n2025-01-15T10:30:00+03:00\n2025-01-15T10:30:00.123456789Z
\n\n

In Go wird zum Parsen die Funktion time.Parse(layout, value) verwendet. Und hier beginnt das Interessante.

\n\n

Fehler Nr. 1: Falscher Layout (Vorlage) – die Hauptursache für Kopfschmerzen

\n\n

Go verwendet einen einzigartigen Ansatz: Das Format wird nicht durch Codes wie YYYY-MM-DD angegeben, sondern durch ein konkretes Datum: Mon Jan 2 15:04:05 MST 2006. Es ist leicht zu merken: 01/02 03:04:05PM '06 -0700 (Monat, Tag, Stunde, Minute, Sekunde, Jahr, Zeitzone).

\n\n

Anfänger versuchen oft, so etwas zu schreiben:

\n\n
// ❌ Fehler!\nt, err := time.Parse("YYYY-MM-DDTHH:MM:SSZ", "2025-01-15T10:30:00Z")
\n\n

Go wird ein solches Format einfach nicht verstehen. Das korrekte Layout für RFC 3339 ist time.RFC3339:

\n\n
// ✅ Richtig\nt, err := time.Parse(time.RFC3339, "2025-01-15T10:30:00Z")\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Println(t) // 2025-01-15 10:30:00 +0000 UTC
\n\n

Die Konstante time.RFC3339 entspricht dem String "2006-01-02T15:04:05Z07:00". Beachten Sie das Z07:00 – dies ist die Bezeichnung für die Zeitzone.

\n\n

Fehler Nr. 2: Ignorieren von Nanosekunden (time.RFC3339 vs time.RFC3339Nano)

\n\n

Das Standard-time.RFC3339 unterstützt keine Nanosekunden. Wenn Ihr String einen Bruchteil einer Sekunde enthält:

\n\n
2025-01-15T10:30:00.123456789Z
\n\n

…dann wird das Parsen mit time.RFC3339 einen Fehler zurückgeben:

\n\n
// ❌ Fehler: parsing time "2025-01-15T10:30:00.123456789Z" as "2006-01-02T15:04:05Z07:00": cannot parse ".123456789Z" as "Z07:00"\nt, err := time.Parse(time.RFC3339, "2025-01-15T10:30:00.123456789Z")
\n\n

Die Lösung ist die Verwendung von time.RFC3339Nano:

\n\n
// ✅ Richtig\nt, err := time.Parse(time.RFC3339Nano, "2025-01-15T10:30:00.123456789Z")\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Println(t) // 2025-01-15 10:30:00.123456789 +0000 UTC
\n\n

Tipp: Wenn Sie sich nicht sicher sind, ob Nanosekunden vorkommen, verwenden Sie time.RFC3339Nano – es ist abwärtskompatibel und funktioniert in beiden Fällen.

\n\n

Fehler Nr. 3: Zeitzone – Z oder +00:00 – ist das nicht dasselbe?

\n\n

Die Strings 2025-01-15T10:30:00Z und 2025-01-15T10:30:00+00:00 bedeuten dasselbe (UTC), aber Go kann sie unterschiedlich verarbeiten, wenn das Layout falsch angegeben ist.

\n\n
// ✅ Beide Varianten funktionieren mit time.RFC3339\nt1, _ := time.Parse(time.RFC3339, "2025-01-15T10:30:00Z")\nt2, _ := time.Parse(time.RFC3339, "2025-01-15T10:30:00+00:00")\nfmt.Println(t1.Equal(t2)) // true
\n\n

Aber wenn Sie Ihr eigenes Layout schreiben, seien Sie vorsichtig:

\n\n
    \

Blogs

Buchempfehlungen