首页 > 解决方案 > 如何修复 MessageFormatter 返回格式不正确的日期?

问题描述

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

<?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 年不受影响。为什么会发生这种情况,有什么解决办法吗?

7.1 版

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

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

标签: phpdateformattingstrftime

解决方案


根据 ISO-8601:1988 周数定义,日历年的最后几天通常属于明年的第一周,大写Y表示“一年中的一周”参考)中的年份。你想要小写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"

推荐阅读