Zum Hauptinhalt springen

Appendix A. ISO 8601 Collected ABNF

Diese Informationen basieren auf der Version von 1988 von ISO 8601. In der Revision von 2000 können einige Änderungen vorhanden sein.

Erklärung

ISO 8601 spezifiziert keine formale Grammatik für die von ihm definierten Datums- und Zeitformate. Das Folgende ist ein Versuch, eine formale Grammatik aus ISO 8601 zu erstellen. Dies dient nur zu Informationszwecken und kann Fehler enthalten. ISO 8601 bleibt die maßgebliche Referenz.

Mehrdeutigkeiten und Interpretationen

Beachten Sie, dass aufgrund von Mehrdeutigkeiten in ISO 8601 einige Interpretationen notwendig waren:

  1. Mischen von Basis- und erweiterten Formaten: ISO 8601 ist nicht klar, ob das Mischen von Basis- und erweitertem Format zulässig ist. Diese Grammatik erlaubt das Mischen.

  2. 24 Stunden: ISO 8601 ist nicht klar, ob die Stunde 24 nur zulässig ist, wenn Minuten und Sekunden 0 sind. Diese Grammatik nimmt an, dass Stunde 24 in jedem Kontext zulässig ist.

  3. Datumsbeschränkungen: Die Beschränkungen in Abschnitt 5.7 bezüglich date-mday gelten.

  4. "T"-Trennzeichen: ISO 8601 spezifiziert, dass "T" unter bestimmten Umständen weggelassen werden kann. Diese Grammatik erfordert "T", um Mehrdeutigkeit zu vermeiden.

  5. Dezimalpunkt: ISO 8601 erfordert (in Abschnitt 5.3.1.3), dass, wenn der Dezimalbruch kleiner als 1 ist, ihm eine "0" vorangestellt werden muss. Anhang B.2 von ISO 8601 gibt Beispiele mit Dezimalbrüchen, denen keine "0" vorangestellt ist. Diese Grammatik geht davon aus, dass Abschnitt 5.3.1.3 korrekt ist und Anhang B.2 fehlerhaft ist.

Vollständige ISO 8601 ABNF-Grammatik

date-century    = 2DIGIT  ; 00-99
date-decade = DIGIT ; 0-9
date-subdecade = DIGIT ; 0-9
date-year = date-decade date-subdecade
date-fullyear = date-century date-year
date-month = 2DIGIT ; 01-12
date-wday = DIGIT ; 1-7 ; 1 is Monday, 7 is Sunday
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31
date-yday = 3DIGIT ; 001-365, 001-366
date-week = 2DIGIT ; 01-52, 01-53

datepart-fullyear = [date-century] date-year ["-"]
datepart-ptyear = "-" [date-subdecade ["-"]]
datepart-wkyear = datepart-fullyear / datepart-ptyear

dateopt-century = "-" / date-century
dateopt-fullyear = "-" / datepart-fullyear
dateopt-year = "-" / (date-year ["-"])
dateopt-month = "-" / (date-month ["-"])
dateopt-week = "-" / (date-week ["-"])

datespec-full = datepart-fullyear date-month ["-"] date-mday
datespec-year = date-century / dateopt-century date-year
datespec-month = "-" dateopt-year date-month [["-"] date-mday]
datespec-mday = "--" dateopt-month date-mday
datespec-week = datepart-wkyear "W"
(date-week / dateopt-week date-wday)
datespec-wday = "---" date-wday
datespec-yday = dateopt-fullyear date-yday

date = datespec-full
/ datespec-year
/ datespec-month
/ datespec-mday
/ datespec-week
/ datespec-wday
/ datespec-yday

time-hour = 2DIGIT ; 00-24
time-minute = 2DIGIT ; 00-59
time-second = 2DIGIT ; 00-58, 00-59, 00-60
time-fraction = ("," / ".") 1*DIGIT
time-numoffset = ("+" / "-") time-hour [[":"] time-minute]
time-zone = "Z" / time-numoffset

timeopt-hour = "-" / (time-hour [":"])
timeopt-minute = "-" / (time-minute [":"])

timespec-hour = time-hour [[":"] time-minute [[":"] time-second]]
timespec-minute = timeopt-hour time-minute [[":"] time-second]
timespec-second = "-" timeopt-minute time-second
timespec-base = timespec-hour / timespec-minute / timespec-second

time = timespec-base [time-fraction] [time-zone]

iso-date-time = date "T" time

RFC 3339 vs Vollständiges ISO 8601

RFC 3339 ist eine eingeschränkte Teilmenge von ISO 8601, keine vollständige Implementierung:

MerkmalISO 8601RFC 3339
Basisformat (20020715)✅ Unterstützt❌ Nicht unterstützt
Erweitertes Format (2002-07-15)✅ Unterstützt✅ Unterstützt
Wochendaten (2002-W29-1)✅ Unterstützt❌ Nicht unterstützt
Ordinaldaten (2002-196)✅ Unterstützt❌ Nicht unterstützt
Teildaten (2002-07)✅ Unterstützt❌ Nicht unterstützt
24 Stunden (2002-07-16T24:00:00)✅ Unterstützt❌ Nicht unterstützt
Zeitzone "Z"✅ Unterstützt✅ Unterstützt
Numerischer Zeitzonen-Offset✅ Unterstützt✅ Unterstützt (obligatorisch)
Bruchsekunden✅ Unterstützt✅ Unterstützt

Gründe für die RFC 3339-Vereinfachung

RFC 3339 wählte eine vereinfachte Teilmenge für:

  1. Interoperabilität: Implementierungsvariationen reduzieren
  2. Klarheit: Mehrdeutigkeit vermeiden
  3. Vollständigkeit: Vollständige Datum-Zeit-Informationen erfordern
  4. Einfachheit: Einfacher zu implementieren und zu testen

Hinweis: Wenn vollständige ISO 8601-Funktionalität (wie Wochendaten) benötigt wird, konsultieren Sie den ISO 8601-Standard direkt. RFC 3339 konzentriert sich auf die häufigsten Zeitstempel-Anwendungsfälle in Internetprotokollen.