如何修复 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"
我有这个简单的代码,以前可以正常工作:
<?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"