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.
相关产品推荐
相关产品推荐

