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

