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

PHP根据周数获取日期列表函数异常求助:周数小于10时出错

问题原因分析

你遇到的问题根源在于ISO 8601周格式的解析规则:strtotime 处理年份+周数+星期几的格式时,要求周数必须是两位数字(比如第5周要写成05,而非5)。

当你传入周数5时,拼接后的字符串会变成2019W51(对应循环里的d=1),这会被strtotime错误解析为2019年第51周的第1天——也就是12月16日,完全偏离了你期望的第5周。后续循环中,d=2会生成2019W52(对应第52周),而d≥3时2019W53是无效格式(2019年最多只有52周),strtotime返回false,date函数处理false时就会输出Unix纪元起始日期01/01/1970。

而周数≥10时,比如37,拼接后的字符串是2019W371,符合两位周数的格式要求,所以解析完全正常。

解决方案

只需要在拼接周数前,给小于10的周数补上前导零,确保周数始终是两位数字。这里提供两种简单实现方式:

方法1:用sprintf格式化周数

通过sprintf的%02d格式化规则,自动给不足两位的数字补零:

public function getDaysofWeek(int $year, int $week){ 
    $days = array(); 
    // 格式化周数为两位,不足补0
    $formattedWeek = sprintf('%02d', $week);
    for($d=1; $d<8; $d++) { 
        $days[] = date('d/m/Y', strtotime($year."W".$formattedWeek.$d)); 
    } 
    var_dump($days); 
}

方法2:用str_pad补前导零

用str_pad手动给周数左侧补零,确保长度为2:

public function getDaysofWeek(int $year, int $week){ 
    $days = array(); 
    // 给周数左侧补0,固定长度为2
    $formattedWeek = str_pad($week, 2, '0', STR_PAD_LEFT);
    for($d=1; $d<8; $d++) { 
        $days[] = date('d/m/Y', strtotime($year."W".$formattedWeek.$d)); 
    } 
    var_dump($days); 
}

可选优化:使用更清晰的ISO格式

你也可以用可读性更强的标准ISO格式字符串(YYYY-Www-d),解析结果完全一致:

$days[] = date('d/m/Y', strtotime("$year-W$formattedWeek-$d"));

验证后,传入2019年第5周时,会正确返回2019年2月4日至2月10日的日期列表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:31:03