Vergleich von RFC 3339 und ISO 8601
(ijmacd.github.io)- Bei der Darstellung von Datum und Uhrzeit ist RFC 3339 eher eine enge Teilmenge, die sich für Web und Internet leicht verwenden lässt, während ISO 8601-1:2019 einen deutlich breiteren Satz von Formaten umfasst
- Der Vergleich ist auf ISO 8601-1:2019 beschränkt; zusätzliche Darstellungen aus ISO 8601-2:2019 wie Jahreszeiten, Mengen, Unsicherheitsqualifizierer oder Datumsarithmetik sind in der Tabelle noch nicht berücksichtigt
- Beide Standards behandeln grundlegende Datums- und Zeitformate, die weit verbreitet sind, etwa
2026-06-26,14:08:00Z,2026-06-26T14:08:00Zund Offsets wie+00:00 - ISO 8601 umfasst außerdem Jahrhunderte, Jahrzehnte, Ordinaldaten, Wochendaten, verkürzte Zeiten, Komma als Dezimaltrennzeichen, Zeitspannen (
P1Y) und Bereiche (2026-06-26/P1Y), während RFC 3339 in der Tabelle meist ausgeschlossen ist - Bei der Date-Time-Notation sind Unterschiede beim
T-Trennzeichen, bei Groß-/Kleinschreibung und bei Offsets wie-00:00Punkte, die in der Praxis über Parser-Kompatibilität entscheiden
Vergleichsumfang und Annahmen
- Die Formattabelle ist keine vollständige Liste
- Der betrachtete Standard ist ISO 8601-1:2019
- Es gibt wichtige Unterschiede zu früheren Ausgaben und Entwürfen
- ISO 8601-2:2019 enthält zusätzliche Darstellungen, die auf dieser Seite aber noch nicht berücksichtigt sind
- unterjährige Gruppen, etwa Jahreszeiten
- Gruppierungseinheiten
- Mengen
- Unsicherheitsqualifizierer
- Datumsarithmetik
- RFC 3339 schlägt in einem nachgeordneten Standard vor,
Tdurch andere Zeichen zu ersetzen, liefert als Beispiel jedoch nur das Leerzeichen - Jeder Standard definiert Formate für bestimmte Zwecke; andere Formate werden nicht empfohlen
ISO 8601 ist bei Datumsangaben breiter
- Sowohl RFC 3339 als auch ISO 8601 unterstützen Jahr-Monat-Tag-Daten wie
2026-06-26 - ISO 8601 deckt mehr Datumsdarstellungen ab als RFC 3339
- Jahrhundert:
20 - Jahrzehnt:
202 - Jahr:
2026 - Jahr-Monat:
2026-06 - Ordinaldatum:
2026-177 - Wochendatum:
2026-W26,2026-W26-5 - Grundformat:
20260626,2026177,2026W26,2026W265
- Jahrhundert:
- In der Tabelle erlaubt RFC 3339 diese ISO-spezifischen Datumsformate nicht
Unterschiede bei Zeitangaben
- Beide Standards erlauben Zeiten mit Sekundenauflösung und Zeitzonen-Offset wie
14:08:00Z,14:08:00+00:00und14:08:00.372+00:00 - RFC 3339 unterscheidet nicht zwischen Groß- und Kleinschreibung, daher können
TundZauch alstbzw.zgeschrieben werden- Auch frühere Ausgaben von ISO 8601 unterschieden hier nicht nach Groß- und Kleinschreibung
- ISO 8601 erlaubt bei der kleinsten Zeiteinheit einen Dezimalanteil
- In der Tabelle werden meist Beispiele mit einer Nachkommastelle gezeigt, der Standard erlaubt aber beliebige Genauigkeit
- Sowohl Komma als auch Punkt sind als Dezimaltrennzeichen zulässig und in allen Formaten austauschbar
- ISO 8601-1:2019 erlaubt das Weglassen von
Tbei alleinstehenden Zeitangaben, sofern keine Mehrdeutigkeit entsteht - ISO 8601 unterstützt verkürzte, grundlegende und Zeitformate mit Komma-Dezimalen wie
14,14:08,14:08:00,140800,T14:08:00,14:08:00,372 - RFC 3339 erlaubt Offsets wie
-00:00in14:08:00-00:00, während ISO 8601 dies in der Tabelle nicht erlaubt
T und Trennzeichen in Date-Time
- Sowohl RFC 3339 als auch ISO 8601 erlauben Date-Time-Angaben wie
2026-06-26T14:08:00Zund2026-06-26T14:08:00+00:00 - In der Date-Time-Darstellung von ISO 8601 ist
Timmer erforderlich- Frühere Ausgaben erlaubten auch das Weglassen von
Tin Date-Time - Auch in früheren Ausgaben war das Einfügen alternativer Trennzeichen wie Leerzeichen oder Unterstrich nicht erlaubt
- Frühere Ausgaben erlaubten auch das Weglassen von
- In der Tabelle erlaubt RFC 3339 die folgenden Date-Time-Varianten
- kleingeschriebenes
tundz:2026-06-26t14:08:00z - Leerzeichen als Trennzeichen:
2026-06-26 14:08:00Z - Unterstrich als Trennzeichen:
2026-06-26_14:08:00Z - Offset
-00:00:2026-06-26T14:08:00-00:00
- kleingeschriebenes
- ISO 8601 behandelt verkürzte Date-Time-Angaben sowie Date-Time auf Basis von Ordinal- und Wochendaten wie
2026-06-26T14,2026-06-26T14:08,2026-06-26T14:08:00,2026-177T14:08,2026-W26-5T14:08
Zeitspannen und Bereiche liegen im Schwerpunkt von ISO 8601
- In der Tabelle sind Zeitspannen-Formate (Periods) nur für ISO 8601 markiert
- Beispiele:
P1Y,P1M,P1W,P1D - Mit Zeitanteil:
PT1H,PT1M,PT1S - Kombinationen:
P1Y1M1DT1H1M1S - Mit Dezimalen:
P1.5Y,P1,5W,PT1.5S
- Beispiele:
- Auch Bereichsformate (Ranges) sind nur für ISO 8601 markiert
- Datum und Zeitspanne:
2026-06-26/P1Y - Datum und Datum:
2026-06-26/2026-06-26 - Zeitspanne und Datum:
P1Y/2026-06-26 - Date-Time und Zeitspanne:
2026-06-26T14:08/P1DT1H - Wiederholungsbereiche:
R/2026-06-26/P1Y,R10/2026-06-26/P1Y
- Datum und Zeitspanne:
Formatschlüssel und Testwerkzeuge
- Die Formattabelle verwendet Formatschlüssel wie
%Y,%M,%D,%h,%m,%s%Y: Year%M: Month%D: Day%V: Week Year%W: Week%w: Week Day%O: Ordinal Day%h: Hour%m: Minute%s: Second%u: Microsecond%n: Nanosecond%Z: Zeitzonenstunde einschließlich+oder-%z: Zeitzonenminute
- Der Formatprüfer überprüft nur, ob ein Eingabeformat einem Format aus der Tabelle entspricht
- Er prüft nicht alle möglichen Formate
- ISO 8601 as a Service ist ein Dienst für Beta-Tests
- Derzeit werden nur Date, Time und DateTime unterstützt
- Period und Range werden nicht unterstützt
- Der Quellcode ist auf GitHub öffentlich verfügbar
1 Kommentare
Meinungen auf Hacker News
Es ist seltsam, dass es keine Möglichkeit gibt, ein zukünftiges Datum/eine zukünftige Uhrzeit bezogen auf eine bestimmte Zeitzone anzugeben. Man könnte zum Beispiel am 1. Juli 2030 um 18 Uhr Ortszeit London ein Meeting planen wollen; egal wie sich die britischen Zeitzonenregeln bis dahin ändern, es sollte „18 Uhr in London“ bleiben.
Derzeit nutzt das Vereinigte Königreich ungefähr von November bis März Z+00:00 und von April bis Oktober Sommerzeit Z+01:00[0], könnte aber vor 2030 Mitteleuropäische Zeit[1] einführen, British Double Summer Time[2] erneut ausprobieren oder die Sommerzeit abschaffen. Dadurch kann dasselbe „18 Uhr“ bezogen auf eine bestimmte Epoch-Zeit stark variieren.
Ich möchte in ein Kalenderereignis „18 Uhr nach Londoner Zeit zu diesem Zeitpunkt“ eintragen, aber es gibt keine standardisierte, interoperable Möglichkeit, 2030-07-01 18:00:00 Europe/London auszudrücken.
[0] https://en.wikipedia.org/wiki/British_Summer_Time
[1] https://en.wikipedia.org/wiki/Central_European_Time
[2] https://en.wikipedia.org/wiki/British_Summer_Time#Periods_of...
tzanhängen; um eine lokale Uhrzeit auszudrücken, muss außerdem ein geschätzter UTC-Offset angegeben werden.Zum Beispiel wird aus
2030-07-01 18:00:00 Europe/Londondann2030-07-01T18:00:00+01:00[Europe/London]. Wenn sich die britischen Regeln bis dahin ändern, wird der Timestamp „inkonsistent“, und die Anwendung entscheidet, wie sie damit umgeht. Setzt man jedoch ein!vor den Zeitzonennamen in den eckigen Klammern, darf der UTC-Offset nicht blind übernommen werden; das Problem muss erkannt werden.Dieses erweiterte Timestamp-Format wird auch in der vorgeschlagenen Temporal-Bibliothek[1] von JavaScript verwendet; die Parsing-Funktion
ZonedDateTime.from()[2] erlaubt es, bei inkonsistenten Timestamps über die Optionoffsetzu steuern, welche Seite Vorrang hat. Auch das Weglassen des UTC-Offsets und die alleinige Angabe der Zeitzone werden unterstützt, allerdings mit dem Hinweis, dass die bei einer Sommerzeitumstellung wiederholte Stunde mehrdeutig ist.[0] https://www.ietf.org/archive/id/draft-ietf-sedate-datetime-e...
[1] https://tc39.es/proposal-temporal/docs/strings.html#iana-tim...
[2] https://tc39.es/proposal-temporal/docs/ambiguity.html#ambigu...
Aber es ist nicht völlig unvorstellbar, dass Schottland bis dahin ein weiteres Unabhängigkeitsreferendum abhält und der Mitteleuropäischen Zeit beitritt oder eine Scottish Standard Time einführt.
2023-11-05 01:30:00 America/New_Yorkkann einer von zwei verschiedenen Zeitpunkten sein.In Kalendern ist „dieselbe Uhrzeit an der Wanduhr“ meistens die gewünschte Bedeutung und daher sinnvoll, aber es gibt UI-Schwierigkeiten beim Umgang mit ungewöhnlichen Uhrzeiten, und man möchte vielleicht eine Möglichkeit zur Auflösung der Mehrdeutigkeit in die Syntax aufnehmen. Zum Glück finden solche Umstellungen meist mitten in der Nacht statt, aber ich habe so etwas im echten Arbeitsalltag schon gesehen.
Wenn man jemanden aus einer Zeitzone ohne Sommerzeit einlädt, verschiebt sich die Uhrzeit in dessen Kalender, und internationale Kolleginnen und Kollegen müssen das manchmal hinnehmen.
[0]: https://www.rfc-editor.org/rfc/rfc5545#section-3.3.5
Gängige Datum-Uhrzeit-Formate wurden dafür entwickelt, einen bestimmten Zeitpunkt auszudrücken, aber in diesem Fall gibt es einen solchen bestimmten Zeitpunkt noch nicht. Es kommt häufig vor, dass Datums-/Zeitangaben nichttriviale Strukturen haben: ein Meeting am letzten Freitag jedes Monats, ein monatliches Meeting, das am 31. Januar beginnt, oder zwei Tage vor Quartalsende.
Ein Standard, der alle denkbaren Fälle abdecken soll, dürfte schnell komplex werden. Wenn einfache Daten, Uhrzeiten und Zeitpunkte nicht ausreichen, bleibt wohl nur, eine eigene Struktur zu schaffen, die alle benötigten Elemente enthält.
Da die ISO-Spezifikation nicht kostenlos verfügbar ist, ist es meist besser, sich an den RFC zu halten; zudem basieren viele Open-Source-Implementierungen auf Entwürfen, sodass man sie nicht wirklich als vollständig Open-Source-freundlich bezeichnen kann. Auch für Open-Source-Entwickler ist das eine große Belastung.
Wenn man etwas baut, das mit zukünftigen Datumsangaben umgeht, möchte man fast immer Wanduhrzeit + Ort speichern. Leider gibt es dafür keinen Standard. In Europa und den USA sind Zeitzonen recht stabil, sodass man das vielleicht nicht so stark merkt, aber in vielen Regionen ändern sich Zeitzonen häufig, weshalb das Speichern eines Offsets nicht stabil ist.
5. Juni 2026, 13:30 Wanduhrzeit, Parisist das, was die meisten Menschen meinen; je nachdem, wie die EU mit der Sommerzeit verfährt, kann das UTC+2 oder UTC+1 sein. Wenn eine API vergangene Zeitpunkte behandelt, kann man einfach POSIX-Timestamps in Sekunden, Millisekunden, Mikrosekunden oder Nanosekunden verwenden.iCal berücksichtigt auch nicht das Problem, dass ein Ort einer anderen Zeitzone neu zugeordnet wird. Außerdem enthält eine korrekte iCal-Datei alle Zeitzonendaten, auf die sie verweist, was umständlich ist, wenn man nur ein einzelnes Datum mit Uhrzeit ausgeben möchte.
[1] https://icalendar.org/iCalendar-RFC-5545/3-3-5-date-time.htm...
2026-06-05T13:30+0200[Europe/Paris]https://www.ietf.org/archive/id/draft-ietf-sedate-datetime-e...
Ein in Standards häufig ignorierter Teil ist die Darstellung von Dauern.
Siehe 5.5.4.2 „Representation of time-interval by duration only“, Seite 21, in http://xml.coverpages.org/ISO-FDIS-8601.pdf. Es wäre gut, wenn JSON-Parser in statischen Sprachen ein Feld als Dauer definieren und in ein gültiges Format serialisieren könnten.
Ein Beispiel für einen Vorschlag in Crystal findet sich hier: https://github.com/crystal-lang/crystal/issues/11942
Zum Beispiel werden 15 Tage, 5 Stunden und 20 Sekunden zu
P15DT5H0M20S, 7 Wochen zuP7W.durationin der ABNF aus Anhang A von RFC 3339 verweisen.Wenn man zum Beispiel
"duration": { "days": 15, "hours": 5, "seconds": 20 }schreibt, muss der JSON-Parser die Bedeutung der Daten nicht verstehen; das kann ein Eingabevalidator übernehmen. Unabhängig davon, wie JSON diese Daten darstellt, braucht man ohnehin einen potenziell fehleranfälligen Umwandlungsschritt.Es ist „witzig“, dass RFC 3339 und ISO 8601 viele redundante Datums-/Uhrzeitformate mit überlappendem Zweck enthalten, aber beide das in allen Systemen am häufigsten verwendete und völlig naheliegende
2023-09-01 15:30:59nicht enthalten.Außerdem sind beide Standards sehr unklar darin, wie Daten vor Christus sowie Daten nach
9999-12-31oder vor-9999-01-01dargestellt werden sollen, und gängige Bibliotheken können damit meist überhaupt nicht umgehen. Selbst wenn sie es tun, ist das Verhalten von00-01-01praktisch undefiniert.Der gregorianische Kalender ist merkwürdig, weil auf 1 v. Chr. direkt 1 n. Chr. folgt, und außerhalb spezialisierter astronomischer Software kann fast keine Software Bereiche weit außerhalb der nahen zukünftigen Unix-Zeit korrekt behandeln. Selbst Dinge, die man problemlos als Strings speichern könnte, etwa die Lebensdaten von Kaiser Augustus, sollten im Standard klar definiert sein.
Tdurch ein Leerzeichen ersetzt werden darf. RFC 3339 macht Ähnliches, nur deutlich umständlicher.Ob
2023-09-01 15:30:59wirklich das am häufigsten verwendete Datums-/Uhrzeitformat ist, ist schwer zu sagen. Die meistverwendete Sprache ist Chinesisch, und eigene Trennzeichen wie2023年9月1日sind verbreitet.ISO 8601 erlaubt bei gegenseitiger Vereinbarung auch Jahre vor 1582 oder nach 9999. Wenn sie nicht in vier Stellen passen, muss ein einzelnes Vorzeichenzeichen vorangestellt werden. Solche Daten werden im Allgemeinen nicht unterstützt, weil man mit ihnen nur wenig Sinnvolles tun kann, aber insbesondere bei unabhängig von C implementierten Bibliotheken habe ich durchaus gesehen, dass sie geparst werden.
00-01-01ist als 1. Januar 1 v. Chr. definiert. ISO 8601 stellt klar, dass Jahreszahlen dem proleptischen gregorianischen Kalender folgen und damit bis minus unendlich extrapoliert werden.Ich verstehe, warum man ein Nicht-Leerzeichen brauchte, aber man hätte zumindest einen Unterstrich oder einen Punkt verwenden können. Und ich verstehe auch nicht, warum man bei einem String den Jahresbereich auf vier Stellen beschränkt und damit die Allgemeingültigkeit des Formats opfert.
Sechsstellige Jahreszahlen wirken wie eine Lösung für ein Problem, das in der Praxis nicht entstehen wird, nur um zukunftsorientiert zu erscheinen. Es ist kaum vorstellbar, dass heutige Technologie oder gesellschaftliche Normen 8000 Jahre fortbestehen.
Die Aussage, ISO 8601 verwende U+2010 HYPHEN und U+2212 MINUS und in Zeichensätzen ohne diese Zeichen müsse U+2D HYPHEN-MINUS verwendet werden, ist falsch.
Tatsächlich legt ISO 8601 fest, dass, wenn der Zielzeichensatz auf ISO/IEC 646 basiert, in beiden Fällen das Hyphen-Minus-Zeichen zu verwenden ist. Unicode ist hier eindeutig eingeschlossen. Es gibt zwar eine gewisse Unschärfe, aber bei Unicode ist die Auslegung klar; es wirkt wie ein indirekter Weg, durch Festlegung des regulären Mappings von 646 die Kompatibilität mit anderen auf 646 basierenden Zeichensätzen sicherzustellen.
Sinngemäß heißt es: „Alle Zeichen, die in Datums- und Zeitdarstellungen verwendet werden, gehören mit Ausnahme von ‘hyphen’, ‘minus’ und ‘plus-minus’ zum ISO/IEC-646-Repertoire. In Umgebungen, die ein auf ISO/IEC 646 basierendes Zeichenrepertoire verwenden, müssen ‘hyphen’ und ‘minus’ beide auf ‘hyphen-minus’ abgebildet werden.“
Da Unicode auf ISO 8859 basiert und ISO 8859 wiederum auf ISO 646, scheint die Absicht für den Unicode-Zeichensatz tatsächlich zu sein, U+2D hyphen-minus zu verwenden.
Unter Windows stört es oft, dass der Doppelpunkt ein Sonderzeichen ist und es deshalb keine RFC-3339-konforme Möglichkeit gibt, Datum und Uhrzeit in Dateinamen zu verwenden.
Es wäre schön, wenn man beim Datum Bindestriche verwenden und beim Zeitteil die Doppelpunkte weglassen könnte und trotzdem ISO 8601 einhielte.
20230831T1510-0500zum Beispiel ist konform und kann in Dateinamen verwendet werden,2023-08-31T1510-0500und ähnliche Varianten dagegen nicht. Nebenbei: Die PowerShell-FunktionGet-Dateversteht den ersten Zeitstempel ohne Bindestriche und Doppelpunkte nicht.Eine sehr gute Visualisierung zu diesem Thema.
Beim Trennen von Datums- und Zeitteil bevorzuge ich Leerzeichen oder Unterstriche statt
T, aber um Probleme mit Systemen zu vermeiden, die nur ISO 8601 verarbeiten, und aus Gründen der Konsistenz verwende ich meistens weiterT.T. Solche Strings wird man wohl kaum versehentlich anhand vonTaufteilen.Zwei Dinge würden mich interessieren. Erstens: Was ist die Begründung für sechsstellige Jahreszahlen? Kein heute entworfenes System wird doch in 100.000 Jahren noch existieren.
Zweitens: ISO 8601 ist weit verbreitet, aber wird RFC 3339 in realen Systemen ebenfalls häufig genutzt und übernommen?
time-Paket von Golang und RustsChronohaben eingebaute Werkzeuge für RFC 3339, aber nicht für RFC 8601.Soweit ich mich erinnere, hatte RFC 8601 Mehrdeutigkeitsprobleme, die RFC 3339 nicht hat, und Python hatte deswegen ebenfalls Probleme bei der Roundtrip-Konvertierung von Datumswerten.
Es gibt kein Format, bei dem die Zeitzone als vier Ziffern ohne Doppelpunkt angegeben wird, aber
date +%zgibt±NNNNzurück.%:z. Außerdem kann mandatebeibringen, standardmäßig so auszugeben: https://gist.github.com/d081dad407432d53172e30d0d35c39db$ date2023-08-31T11:15:00-07:00±NNNNist ohne Doppelpunkt gültig, wenn es als Teil des „Basisformats“ verwendet wird. Das heißt, im gesamten Format dürfen weder Bindestriche noch Doppelpunkte vorkommen.Daher sind die folgenden beiden Angaben äquivalent und beide gültig:
2023-09-01T09:40:01+08:0020230901T094001+0800