首页 > 解决方案 > 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

解决方案


这是格式的不同。它不使用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'));

推荐阅读