PHP 8使用相对日期表述获取次年1月第二个周五结果错误是什么原因
结论
这不是PHP的BUG,是DateTime类解析相对日期字符串的底层执行逻辑导致的正常现象。
底层解析逻辑
PHP解析相对日期字符串时按从左到右的顺序逐段执行修饰规则,不会将整个短语作为完整语义做合并处理,你的两个写法的解析流程差异如下:
- 写法1
second friday of january next year的解析流程:- 以当前执行脚本的日期为基准,先处理
second friday of january:得到当前年份1月的第二个周五 - 再处理后缀的
next year:将上一步得到的日期加1年
若在2021年执行这段代码,第一步得到2021-01-08,加1年后就得到了错误的2022-01-08。
- 以当前执行脚本的日期为基准,先处理
- 写法2
second friday of 2022-01的解析流程:- 先锁定日期范围为2022年1月
- 在这个固定范围内查找第二个周五,因此得到正确的2022-01-14
正确实现方案
如果要动态获取次年1月的第二个周五,推荐用以下两种更稳妥的写法:
- 先锁定年份再查询
$nextYear = date('Y') + 1; $secondFri = new DateTime("second friday of january $nextYear");
- 先指定基准日期再修改
// 先定位到次年1月1日 $janBase = new DateTime('first day of january next year'); // 基于这个基准找第二个周五 $secondFri = $janBase->modify('second friday');
内容的提问来源于stack exchange,提问作者arc
相关产品推荐
相关产品推荐

