如何修复 MessageFormatter 返回格式不正确的日期?

How to fix MessageFormatter returning incorrect date formatted?

我有这个简单的代码,以前可以正常工作:

<?php
$dateFormatted = \MessageFormatter::formatMessage(
    'en_US', "{0, date, d MMMM YYYY}", [new \DateTime()]
);

var_dump($dateFormatted); // 28 December 2019

但是从 2019 年 12 月 29 日开始显示明年的日期:

var_dump($dateFormatted); // 29 December 2020

我检查到 2050 年之前的每一年都会发生这种情况。据我所知,它只发生在去年 12 月的几天,但我不确定。 2018年不受影响。为什么会发生这种情况,是否有任何解决方法?

php 版本 7.1

更新:看起来 strftime 有同样的问题

Upd2:strftime 使用 %Y 显示正确的年份,但不使用 %G

不幸的是 MessageFormatter 的文档没有解释 date 格式。但我找到了解决方法。你可以使用较低的 y。尝试:

$dateFormatted = \MessageFormatter::formatMessage(
    'en_US', "{0, date, d MMMM y}", [new \DateTime()]
);
echo $dateFormatted; // 30 December 2019

而对于 strftime,您可以使用 strftime("%d %B %Y")。 我认为这个问题来自 ISO_8601 格式标准

大写 Y 表示 "Week of Year" 年 (reference),根据 ISO-8601:1988 周数定义,其中日历年的最后几天通常属于明年的第一周。你想要小写 y:

<?php
$dateFormatted = \MessageFormatter::formatMessage(
    'en_US', "{0, date, d MMMM YYYY} / {0, date, d MMMM yyyy}", [new \DateTime('2019-12-29')]
);
var_dump($dateFormatted);
string(37) " 29 December 2020 /  29 December 2019"