PHP DateTime::createFromFormat 返回错误的日期

2024-03-20

当尝试跑步时createFromFormat使用太平洋/奥克兰时区和格式字符串“F-Y”。尽管我提供了“2019 年 9 月”,但返回的日期是 10 月 1 日。

我尝试在 CLI 和 FPM 中的 PHP 7.3.9 和 7.2.22 上运行它,并在 PHP 沙箱中在线运行它。

<?php
echo DateTime::createFromFormat('F-Y', 'September-2019')                                                           
    ->setTimezone(new DateTimeZone('Pacific/Auckland'))
    ->format('Y-m-d');
// 2019-10-01

echo DateTime::createFromFormat('F-Y', 'September-2019')
    ->format('Y-m-d');
// 2019-09-01

在这两个示例中,返回的日期应为 2019-09-01。这不是昨天发生的事。


出现此行为的原因是,当您未指定日期/时间输入的缺失部分时DateTime::createFromFormat https://www.php.net/manual/en/datetime.createfromformat.php,它使用当前本地日期和时间的值。在奥克兰,该日期是 10 月 31 日,因此它会尝试将日期定在 2019 年 9 月 31 日之外,结果显示为 2019 年 10 月 1 日。为避免此问题,请使用!在格式字符串的开头;这将根据需要替换 1970 年 1 月 1 日 00:00:00(Unix 纪元)中未在时间值中指定的值:

echo DateTime::createFromFormat('!F-Y', 'September-2019')
    ->setTimeZone(new DateTimeZone('Pacific/Auckland'))
    ->format('Y-m-d');

Output:

2019-09-01

3v4l.org 上的演示 https://3v4l.org/ANjHT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP DateTime::createFromFormat 返回错误的日期 的相关文章

随机推荐