Appendix A. ISO 8601 Collected ABNF
Cette information est basée sur la version 1988 d'ISO 8601. Il peut y avoir quelques changements dans la révision de 2000.
Explication
ISO 8601 ne spécifie pas de grammaire formelle pour les formats de date et d'heure qu'il définit. Ce qui suit est une tentative de créer une grammaire formelle à partir d'ISO 8601. Ceci est fourni à titre informatif uniquement et peut contenir des erreurs. ISO 8601 reste la référence faisant autorité.
Ambiguïtés et interprétations
Notez qu'en raison d'ambiguïtés dans ISO 8601, une certaine interprétation a été nécessaire :
-
Mélange de formats de base et étendus : ISO 8601 n'est pas clair si le mélange de format de base et étendu est autorisé. Cette grammaire permet le mélange.
-
24 heures : ISO 8601 n'est pas clair si l'heure 24 n'est autorisée que si les minutes et les secondes sont 0. Cette grammaire suppose que l'heure 24 est autorisée dans n'importe quel contexte.
-
Restrictions de date : Les restrictions de la section 5.7 concernant date-mday s'appliquent.
-
Délimiteur "T" : ISO 8601 spécifie que "T" peut être omis dans certaines circonstances. Cette grammaire requiert "T" pour éviter l'ambiguïté.
-
Point décimal : ISO 8601 exige (dans la section 5.3.1.3) que si la fraction décimale est inférieure à 1, elle doit être précédée d'un "0". L'annexe B.2 d'ISO 8601 donne des exemples avec des fractions décimales non précédées de "0". Cette grammaire suppose que la section 5.3.1.3 est correcte et l'annexe B.2 est erronée.
Grammaire ABNF complète 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 complet
RFC 3339 est un sous-ensemble restreint d'ISO 8601, pas une implémentation complète :
| Fonctionnalité | ISO 8601 | RFC 3339 |
|---|---|---|
| Format de base (20020715) | ✅ Pris en charge | ❌ Non pris en charge |
| Format étendu (2002-07-15) | ✅ Pris en charge | ✅ Pris en charge |
| Dates de semaine (2002-W29-1) | ✅ Pris en charge | ❌ Non pris en charge |
| Dates ordinales (2002-196) | ✅ Pris en charge | ❌ Non pris en charge |
| Dates partielles (2002-07) | ✅ Pris en charge | ❌ Non pris en charge |
| 24 heures (2002-07-16T24:00:00) | ✅ Pris en charge | ❌ Non pris en charge |
| Fuseau horaire "Z" | ✅ Pris en charge | ✅ Pris en charge |
| Décalage de fuseau horaire numérique | ✅ Pris en charge | ✅ Pris en charge (obligatoire) |
| Secondes fractionnaires | ✅ Pris en charge | ✅ Pris en charge |
Raisons de la simplification de RFC 3339
RFC 3339 a choisi un sous-ensemble simplifié pour :
- Interopérabilité : Réduire les variations d'implémentation
- Clarté : Éviter l'ambiguïté
- Complétude : Exiger des informations complètes de date-heure
- Simplicité : Plus facile à implémenter et à tester
Remarque : Si la fonctionnalité complète d'ISO 8601 (comme les dates de semaine) est nécessaire, consultez directement la norme ISO 8601. RFC 3339 se concentre sur les cas d'utilisation d'horodatage les plus courants dans les protocoles Internet.