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

DateTime指定周与年份返回错误日期,请求排查原因

问题原因与解决方法

这不是PHP的Bug,是你使用的日期字符串格式不符合PHP DateTime的解析逻辑导致的。

核心问题解析

PHP的DateTime解析器在处理星期几 YYYYWW这种混合格式时,会将monday/sunday作为相对日期修饰符,而非直接指定目标周的对应星期几。这种混合写法会和周数规则产生冲突,导致解析结果偏离预期:

  • 当你写monday 2023W18时,解析器会尝试找到「属于2023年第18周范围内的下一个周一」,而非直接定位该周的周一,最终因日期上下文干扰得到了次日的结果。
  • 同理,sunday 2023W18会被解析为「属于2023年第18周范围内的下一个周日」,但相对修饰符的计算逻辑和周数规则冲突,导致返回了该周的周一。

正确的写法

要准确获取ISO周内的指定星期几,应该使用标准ISO 8601周日期格式:

  • 格式为YYYYWWD,其中D是1-7的数字,1代表周一,7代表周日。
  • 或者直接使用YYYYWW,它默认指向该ISO周的周一。

示例代码:

// 获取2023年第18周的周一(正确返回2023-05-01)
echo (new DateTime('2023W18'))->format('Y-m-d');
// 或者明确指定周内第1天(周一)
echo (new DateTime('2023W181'))->format('Y-m-d');

// 获取2023年第18周的周日(正确返回2023-05-07)
echo (new DateTime('2023W187'))->format('Y-m-d');

额外说明

ISO 8601标准中,周数的定义是:每周从周一开始,第1周是包含当年第一个周四的那一周。2023年第18周的时间范围是2023-05-01至2023-05-07,符合这个标准。

内容的提问来源于stack exchange,提问作者Peter G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:05:23