背景
我想从 PHP 8.2 的 DateTime
对象中生成一个 ISO-8601 字符串。 Date
类有 两个相关的预定义常量 用于 date_format()
函数:
DATE_ISO8601
-"Y-m-d\\TH:i:sO"
注意:此格式与 ISO-8601 不兼容,但出于向后兼容性的原因保留了这种方式。使用 DateTimeInterface::ISO8601_EXPANDED、DateTimeInterface::ATOM 以与 ISO-8601 兼容。(参考 ISO8601:2004 第 4.3.3 条款 d)DATE_ISO8601_EXPANDED
-"X-m-d\\TH:i:sP"
此格式允许年份范围超出 ISO-8601 的正常范围 0000-9999,始终包含符号字符。它还解决了时区部分(+01:00)与 ISO-8601 兼容的问题。
问题
DATE_ISO8601_EXPANDED
格式在字符串前面添加了一个 +
字符,但这个字符并不被其他语言(特别是 Swift)中的 ISO8601 解析器所识别:
+2023-03-29T05:54:21+00:00
DATE_ISO8601
的输出为:
2023-03-29T05:54:21+0000
我无法确定关于DATE_ISO8601
的警告是什么意思。它是指:
- "该格式不符合ISO8601的最新修订版本,因此您应该使用“扩展”变体。"
还是
- "该格式存在错误,有时会产生无效的ISO8601输出,因此您应该使用扩展格式。"
令人捧腹的是,ISO 8601的第4节 没有公开出售, 所以我无法阅读它。但是,“扩展”格式似乎也不是标准的ISO8601,因为规格说明只在年份大于9999时要求前导+
符号。
x
将是可选的+
,而X
始终包含+
。如果您想要与其他解析器兼容,使用自己的格式字符串可能会起到作用。当然,这就错过了使用很好预定义常量的重点... - deceze'c'
或DATE_ATOM
:https://3v4l.org/9kKch#v8.2.4 - 不管怎样,这是一个很好的问题。 - Álvaro González