Context

我想从PHP8.2中的DateTime对象生成ISO-8601字符串.Date类的date_f或mat()函数有two related predefined constants:

  • 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兼容.

Question

DATE_ISO8601_EXPANDED格式在字符串中添加一个前导+字符,其他语言(特别是SWIFT)的ISO8601解析器无法识别该字符:

+2023-03-29T05:54:21+00:00

DATE_ISO8601的输出为:

2023-03-29T05:54:21+0000

我无法确定关于DATE_ISO8601的警告是什么意思.这是否意味着:

  1. "This f或mat doesn't adhere to the latest revision of ISO8601, so you should use the 'expanded' variant instead."

  1. "There are bugs in this f或mat that sometimes produce invalid ISO8601 output, so you should use the expanded f或mat."

Hilariously, section 4 of ISO 8601 is not publicly available without purchase, so I can't read it. But the "expanded" f或mat doesn't appear to be standard ISO8601 either, since the spec calls f或 a leading + symbol only when the year is greater than 9999.

推荐答案

该说明意味着DATE_ISO8601格式与ISO-8601完全不兼容,您不应该使用它,而应该使用DATE_ISO8601_EXPANDEDDATE_ATOM.兼容性问题is not related与您是否使用年份大于0000-9999的日期有关.你可以阅读更多关于here的内容.

DATE_ISO8601_EXPANDED格式与DATE_ATOM的不同之处仅在于年份表示法,DATE_ISO8601_EXPANDED使用'X'而不是'Y':

"Y-m-d\\TH:i:sP"
"X-m-d\\TH:i:sP"

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

扩展表示法只能在事先约定的情况下使用,这可能是一些解析器在年前不能正确处理符号的原因.虽然我也不确定DATE_ISO8601_EXPANDED是否与ISO-8601兼容,因为它讨论了扩展年份表示的恒定位数.

您可以在此处找到一些免费的ISO-8601链接: https://github.com/php/doc-en/pull/1619

Php相关问答推荐

如果再次调用SESSION_START(),会话.gc-max是否会重新启动?或者它是从第一次创建会话开始计算的?

WooCommerce数量减号和加号图标未显示

WooCommerce HPOS管理订单列表中带有订单元数据的定制列

在Laravel中为表添加前缀,以将它们逻辑地分组

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

如何在PHP中出现弃用警告时触发错误?

Symfony Validator:如何使用XML表示法验证深度嵌套的数据?

CKEDITOR-如何在PHP中判断提交后的空数据

显示自定义 Laravel 9 公共属性的错误

使用现有的htaccess的PHP路由脚本

URL中包含"&"与DirectoryIterator不兼容

.htaccess环境变量条件不被判断

如何使用动态变量定义 bind_result?

如何从此字符串创建 Carbon 对象:2022-06-21T05:52:46.648533678Z?

输出每个可能的产品选项

遇到特定键时修改二维数组以创建嵌套数据集

从 CSV 文件 seeder 数据库时的额外行

Symfony 6 中的入口点 (public/index.php) - 它是如何工作的?

使用 v-for 的存储链接中的 Img src 在 Laravel vuejs 中不起作用

递归数组处理