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

