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:
-
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.
-
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.
-
Restrizioni di data: Si applicano le restrizioni nella sezione 5.7 riguardanti date-mday.
-
Delimitatore "T": ISO 8601 specifica che "T" può essere omesso in determinate circostanze. Questa grammatica richiede "T" per evitare ambiguità.
-
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:
| Caratteristica | ISO 8601 | RFC 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:
- Interoperabilità: Ridurre le variazioni di implementazione
- Chiarezza: Evitare l'ambiguità
- Completezza: Richiedere informazioni complete su data-ora
- 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.