You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8使用相对日期表述获取次年1月第二个周五结果错误是什么原因

结论

这不是PHP的BUG,是DateTime类解析相对日期字符串的底层执行逻辑导致的正常现象。

底层解析逻辑

PHP解析相对日期字符串时按从左到右的顺序逐段执行修饰规则,不会将整个短语作为完整语义做合并处理,你的两个写法的解析流程差异如下:

  • 写法1 second friday of january next year的解析流程:
    1. 以当前执行脚本的日期为基准,先处理second friday of january:得到当前年份1月的第二个周五
    2. 再处理后缀的next year:将上一步得到的日期加1年
      若在2021年执行这段代码,第一步得到2021-01-08,加1年后就得到了错误的2022-01-08。
  • 写法2 second friday of 2022-01的解析流程:
    1. 先锁定日期范围为2022年1月
    2. 在这个固定范围内查找第二个周五,因此得到正确的2022-01-14

正确实现方案

如果要动态获取次年1月的第二个周五,推荐用以下两种更稳妥的写法:

  1. 先锁定年份再查询
$nextYear = date('Y') + 1;
$secondFri = new DateTime("second friday of january $nextYear");
  1. 先指定基准日期再修改
// 先定位到次年1月1日
$janBase = new DateTime('first day of january next year');
// 基于这个基准找第二个周五
$secondFri = $janBase->modify('second friday');

内容的提问来源于stack exchange,提问作者arc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 19:57:01