PHP 日期格式:ISO8601 与 ISO8601_EXPANDED

Bry*_*yan 5 php date iso8601

语境

我想从DateTimePHP 8.2 中的对象生成 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
Run Code Online (Sandbox Code Playgroud)

的输出DATE_ISO8601是:

2023-03-29T05:54:21+0000
Run Code Online (Sandbox Code Playgroud)

我无法确定警告的DATE_ISO8601含义。是不是意味着:

  1. “此格式不符合 ISO8601 的最新版本,因此您应该使用‘扩展’变体。”

或者

  1. “这种格式存在错误,有时会产生无效的 ISO8601 输出,因此您应该使用扩展格式。”

有趣的是,ISO 8601 第 4 节如果不购买就无法公开获取,所以我无法阅读它。但“扩展”格式似乎也不是标准 ISO8601,因为该规范+仅在年份大于 9999 时才要求使用前导符号。

Max*_*rin 3

该注释意味着该格式DATE_ISO8601与 ISO-8601 根本不兼容,您不应使用它,而应使用DATE_ISO8601_EXPANDEDDATE_ATOM。兼容性问题与是否使用年份超出 0000-9999 的日期无关。您可以在这里阅读更多相关内容。

格式仅在年份表示上DATE_ISO8601_EXPANDED有所不同,使用而不是:DATE_ATOMDATE_ISO8601_EXPANDED'X''Y'

"Y-m-d\\TH:i:sP"
"X-m-d\\TH:i:sP"
Run Code Online (Sandbox Code Playgroud)

因此,如果您不需要 0-9999 之外的值的扩展年份表示,请使用DATE_ATOM.

扩展表示只能在事先达成协议的情况下使用,这可能就是为什么某些解析器无法正确处理年份之前的符号的原因。尽管我也不确定是否DATE_ISO8601_EXPANDED与 ISO-8601 兼容,因为它讨论了扩展年份表示的恒定位数。

您可以在这里找到一些 ISO-8601 的链接,无需付费: https: //github.com/php/doc-en/pull/1619