2016-07-07T21:18:22+03:00
是正确的 ISO 8601:2004 表示。
2016-07-07T21:18:22+0300
不正确,当日期和时间为扩展格式时,区域指示符可能不是基本格式。
ISO 8601:2004 4.3 日期和时间:
[...] 表达式应完全采用基本格式,在
在这种情况下,所需的最小分隔符数量
表达式被使用,或完全以扩展格式使用,在这种情况下
应使用额外的分隔符[...]
更新 1:
ISO 8601 指定了三种不同的日期表示:日历、序号和星期日期。 Theese 可以被格式化为基本格式(分隔符的最少数量)或扩展格式(包括附加分隔符的基本格式的扩展)。 ISO 8601 要求生成的表达式要么始终采用基本格式,要么始终采用扩展格式。
本地时间的日历日期和时间与 UTC 不同的组合:
2016-07-07T21:18:22+03:00 (extended format)
20160707T211822+0300 (basic format)
本地时间的序数日期和时间与 UTC 不同的组合:
2016-189T21:18:22+03:00 (extended format)
2016189T211822+0300 (basic format)
本地时间的星期日期和时间与UTC的差异:
2016-W27-4T21:18:22+03:00 (extended format)
2016W274T211822+0300 (basic format)
以上所有表示均表示本地时间的相同日期和时间,与 UTC(和即时)不同。如果 API 记录它接受 ISO 8601 日期、时间和区域指示符(也称为完整表示),则它应该接受上述所有表示以符合 ISO 8601。
更新 2:
我遇到的大多数错误都源于使用strftime() 以本地时间输出 ISO 8601 日期和时间,与扩展格式的 UTC 不同。由于z 转换说明符的限制,标准strftime() 只能输出基本格式的兼容表示:
本地时间的日历日期和时间与 UTC 不同的组合:
Format: Example:
%Y%m%dT%H%M%S%z 20160707T211822+0300
本地时间的序数日期和时间与 UTC 不同的组合:
Basic format: Example:
%Y%jT%H%M%S%z 2016189T211822+0300
本地时间的星期日期和时间与UTC的差异:
Basic format: Example:
%GW%V%uT%H%M%S%z 2016W274T211822+0300
GNU strftime 实现支持百分比和z 转换说明符之间的: 标志,以指定区域指示符应以扩展格式格式化:
本地时间的日历日期和时间与 UTC 不同的组合:
Format: Example:
%Y-%m-%dT%H:%M:%S%:z 2016-07-07T21:18:22+03:00
本地时间的序数日期和时间与 UTC 不同的组合:
Format: Example:
%Y-%jT%H:%M:%S%:z 2016-189T21:18:22+03:00
本地时间的星期日期和时间与UTC的差异:
Format: Example:
%G-W%V-%uT%H:%M:%S%:z 2016-W27-4T21:18:22+03:00