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

PHP如何获取指定日期对应周数的正确所属年份

问题原因

date("W")返回的是ISO-8601标准定义的周数,这套周数规则和自然年的计数逻辑不一样:

  • 每周以周一为起始
  • 每年的第1周,需要满足至少有4天落在该自然年内(等价于该周包含1月4日)

所以年初、年末的日期很容易出现「日期在A年,但所属周数算B年」的情况。比如你测试的2022-01-02,所在周的周一是2021年12月27日,整周只有1月1日、1月2日两天落在2022年,不满足第一周的要求,因此这一周属于2021年的第52周,只取周数自然会出现和年份不匹配的问题。

正确获取方式

PHP已经提供了专门和W(ISO周数)配对的年份格式化符o,它返回的就是当前周数实际归属的年份,直接和W搭配使用即可,不需要自己手动计算判断。

修正后的测试代码:

$date = "2022-01-02 00:00:00";
$timestamp = strtotime($date);
$belongYear = date("o", $timestamp);
$weekNum = date("W", $timestamp);
echo $belongYear . "年 第" . $weekNum . "周\n";
// 输出结果:2021年 第52周

如果你使用DateTime类操作日期,逻辑完全一致,在format方法中使用o即可获取对应周年:

$dateObj = new DateTime("2022-01-02 00:00:00");
$belongYear = $dateObj->format("o");
$weekNum = $dateObj->format("W");
注意事项
  • 不要用返回自然年的Y格式化符和W搭配,否则年初年末必然出现周数和年份错配的问题
  • 类似的错配案例还有2020年12月31日,该日期属于2021年的第1周,用Y会拿到2020,和周数01搭配就会出现逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:30:35