php - PHP IntlDateFormatter 返回错误的年份
问题描述
我在日期转换方面遇到问题,经过大量测试后,我不明白我错过了什么。
我从存储在 MySQL 数据库中的典型日期时间开始 (2019-12-31 09:35:16)。
更准确地说,我在 Windows 上使用 PHP 7.2.10
这是一个简单的例子:
$formatter = new IntlDateFormatter(
'fr-FR',
IntlDateFormatter::NONE,
IntlDateFormatter::NONE,
new DateTimeZone('Europe/Paris'),
IntlDateFormatter::GREGORIAN,
'd/M/Y HH:mm \'UTC\'XXX'
);
echo $formatter->format(new \DateTime('2019-12-31 09:35:16'));
答案给我31/12/2020 09:35 UTC+01:00
而不是31/12/2019 09:35 UTC+01:00
.
经过一些尝试,这种年变化也出现在 2013 年和 2025 年(并且可能每六年发生一次......)。
我究竟做错了什么?
解决方案
这是格式的不同。它不使用PHP 日期格式,它使用ICU 日期格式。y/Y 格式不同:
Date Field Symbol Table
Symbol Meaning Example(s)
y year (yy or y or yyyy) 96 or 1996
Y year of "Week of Year" Y 1997
由于 2019-12-31 是星期二,因此它属于 2020 年的一周。相反,您将使用y
该格式。
$formatter = new IntlDateFormatter(
'fr-FR',
IntlDateFormatter::NONE,
IntlDateFormatter::NONE,
new DateTimeZone('Europe/Paris'),
IntlDateFormatter::GREGORIAN,
'd/M/y HH:mm \'UTC\'XXX'
);
echo $formatter->format(new \DateTime('2019-12-31 09:35:16'));
推荐阅读
- android - Android:ConcurrentModificationException 错误
- python - PYTHON AUTH0 POST REQUEST:无效的请求负载 JSON 格式
- swift - 调用我自己的 API 到我的移动应用程序
- google-maps - 如何将热图添加到 Flutter 移动应用程序
- python - 如何解决此错误:对于大小为 3 的轴 0,索引 3 超出范围?
- typescript - Typescript类型的未知长度数组中所有对象的交集
- css - 有没有办法让两个兄弟元素相互影响?
- oracle-apex - APEX 动态操作不复制值
- ios - 按关键字搜索 iOS 照片?
- amazon-web-services - 如何在本地 sam 中尝试 AWS Appsync