Passa al contenuto principale

Appendix A. ISO 8601 Collected ABNF

Queste informazioni si basano sulla versione 1988 di ISO 8601. Potrebbero esserci alcune modifiche nella revisione del 2000.

Spiegazione

ISO 8601 non specifica una grammatica formale per i formati di data e ora che definisce. Quanto segue è un tentativo di creare una grammatica formale da ISO 8601. Questo è solo a scopo informativo e può contenere errori. ISO 8601 rimane il riferimento autorevole.

Ambiguità e interpretazioni

Si noti che a causa di ambiguità in ISO 8601, è stata necessaria una certa interpretazione:

  1. Miscelazione di formati base ed estesi: ISO 8601 non è chiaro se la miscelazione di formato base ed esteso sia consentita. Questa grammatica permette la miscelazione.

  2. 24 ore: ISO 8601 non è chiaro se l'ora 24 sia consentita solo se minuti e secondi sono 0. Questa grammatica presume che l'ora 24 sia consentita in qualsiasi contesto.

  3. Restrizioni di data: Si applicano le restrizioni nella sezione 5.7 riguardanti date-mday.

  4. Delimitatore "T": ISO 8601 specifica che "T" può essere omesso in determinate circostanze. Questa grammatica richiede "T" per evitare ambiguità.

  5. Punto decimale: ISO 8601 richiede (nella sezione 5.3.1.3) che se la frazione decimale è inferiore a 1, deve essere preceduta da "0". L'appendice B.2 di ISO 8601 fornisce esempi con frazioni decimali non precedute da "0". Questa grammatica presume che la sezione 5.3.1.3 sia corretta e l'appendice B.2 sia errata.

Grammatica ABNF completa ISO 8601

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 ISO 8601 completo

RFC 3339 è un sottoinsieme limitato di ISO 8601, non un'implementazione completa:

CaratteristicaISO 8601RFC 3339
Formato base (20020715)✅ Supportato❌ Non supportato
Formato esteso (2002-07-15)✅ Supportato✅ Supportato
Date di settimana (2002-W29-1)✅ Supportato❌ Non supportato
Date ordinali (2002-196)✅ Supportato❌ Non supportato
Date parziali (2002-07)✅ Supportato❌ Non supportato
24 ore (2002-07-16T24:00:00)✅ Supportato❌ Non supportato
Fuso orario "Z"✅ Supportato✅ Supportato
Offset del fuso orario numerico✅ Supportato✅ Supportato (obbligatorio)
Secondi frazionari✅ Supportato✅ Supportato

Motivi della semplificazione di RFC 3339

RFC 3339 ha scelto un sottoinsieme semplificato per:

  1. Interoperabilità: Ridurre le variazioni di implementazione
  2. Chiarezza: Evitare l'ambiguità
  3. Completezza: Richiedere informazioni complete su data-ora
  4. Semplicità: Più facile da implementare e testare

Nota: Se è necessaria la funzionalità completa di ISO 8601 (come le date di settimana), consultare direttamente lo standard ISO 8601. RFC 3339 si concentra sui casi d'uso di timestamp più comuni nei protocolli Internet.