Appendix A. ISO 8601 Collected ABNF (附录 A. ISO 8601 收集的 ABNF)
此信息基于 ISO 8601 的 1988 版本。2000 年修订版可能有一些变化。
Explanation (说明)
ISO 8601 没有为其定义的日期和时间格式指定正式语法。以下是从 ISO 8601 创建正式语法的尝试。这仅供参考, 可能包含错误。ISO 8601 仍然是权威参考。
Ambiguities and Interpretations (歧义和解释)
请注意, 由于 ISO 8601 中的歧义, 需要进行一些解释:
-
Mixing Basic and Extended Formats (混合基本格式和扩展格式): ISO 8601 不清楚是否允许混合基本格式和扩展格式。此语法允许混合。
-
24 Hours (24 小时): ISO 8601 不清楚是否仅在分钟和秒为 0 时才允许 24 小时。此语法假设 24 小时在任何上下文中都是允许的。
-
Date Restrictions (日期限制): 第 5.7 节中关于 date-mday 的限制适用。
-
"T" Delimiter ("T" 分隔符): ISO 8601 指定在某些情况下可以省略 "T"。此语法要求 "T" 以避免歧义。
-
Decimal Point (小数点): ISO 8601 要求 (在第 5.3.1.3 节中) 如果小数部分小于 1, 则必须在前面加上 "0"。ISO 8601 的附录 B.2 给出了前面没有 "0" 的小数部分的示例。此语法假设第 5.3.1.3 节是正确的, 附录 B.2 是错误的。
Complete ISO 8601 ABNF Grammar (完整的 ISO 8601 ABNF 语法)
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 Complete ISO 8601 (RFC 3339 与完整 ISO 8601 的对比)
RFC 3339 是 ISO 8601 的受限子集, 而不是完整实现:
| 特性 | ISO 8601 | RFC 3339 |
|---|---|---|
| 基本格式 (20020715) | ✅ 支持 | ❌ 不支持 |
| 扩展格式 (2002-07-15) | ✅ 支持 | ✅ 支持 |
| 周日期 (2002-W29-1) | ✅ 支持 | ❌ 不支持 |
| 序数日期 (2002-196) | ✅ 支持 | ❌ 不支持 |
| 部分日期 (2002-07) | ✅ 支持 | ❌ 不支持 |
| 24 小时 (2002-07-16T24:00:00) | ✅ 支持 | ❌ 不支持 |
| 时区 "Z" | ✅ 支持 | ✅ 支持 |
| 数字时区偏移量 | ✅ 支持 | ✅ 支持 (强制性) |
| 小数秒 | ✅ 支持 | ✅ 支持 |
Reasons for RFC 3339 Simplification (RFC 3339 简化的原因)
RFC 3339 选择简化子集的原因:
- Interoperability (互操作性): 减少实现变化
- Clarity (清晰性): 避免歧义
- Completeness (完整性): 要求完整的日期-时间信息
- Simplicity (简洁性): 更容易实现和测试
注意: 如果需要完整的 ISO 8601 功能 (如周日期), 请直接查阅 ISO 8601 标准。RFC 3339 专注于互联网协议中最常见的时间戳用例。