PHP 7.1.33格式化2021年初日期时date函数为何返回错误年份
问题核心原因
o是PHPdate()函数中对应ISO-8601周归属年份的格式符,并非自然公历年的取值,这个表现和你当前使用的PHP 7.1.33版本无关,是格式符本身的规则定义导致的。- ISO-8601对周归属年的判定规则为:某周如果在当年包含的自然日不足4天,就会被划分到上一个公历年的周计数中,对应的周年份值就会输出上一年的数值。
日期边界的具体判定
- 2021年1月1日为周五,按照规则计算:
- 2021年的第一个合规ISO周从1月4日(周一)启动,这一周完整覆盖2021年的7个自然日,满足判定阈值,因此1月4日的
o值为2021,输出符合预期。 - 1月3日属于2020年12月28日-2021年1月3日的自然周,这一周里属于2021年的自然日仅有3天(1月1日-3日),未达到4天的判定标准,因此被划分为2020年的第53周,
o值返回2020,出现了看似“年份显示错误”的结果。
- 2021年的第一个合规ISO周从1月4日(周一)启动,这一周完整覆盖2021年的7个自然日,满足判定阈值,因此1月4日的
修正方案
- 如果需要输出日期本身对应的自然公历年,把格式符里的
o替换成Y即可,也就是将date('M j, o', strtotime($date))修改为date('M j, Y', strtotime($date)),即可得到预期的2021年输出。 - 如果业务逻辑本身需要遵循ISO周的年份计数规则,那么当前的输出是符合标准的,不需要调整。
修正后代码示例
$date = "2021-01-03 10:45:06"; echo date('M j, Y', strtotime($date)); // 输出 Jan 3, 2021,匹配预期 $date = "2021-01-04 10:45:06"; echo date('M j, Y', strtotime($date)); // 输出 Jan 4, 2021,匹配预期
内容的提问来源于stack exchange,提问作者XtevensChannel
相关产品推荐
相关产品推荐

