PHP获取指定日期所在周日至周六整周日期的问题求助
解决PHP获取周日至周六整周日期的问题
我来帮你搞定这个问题!你遇到的核心问题是ISO-8601周数(W格式符)的规则和你的需求不匹配:PHP里的W是按周一作为周起始来计算的,所以当输入日期是周日时,它会被归到上一个ISO周,自然就返回了上周的日期。另外原代码直接取输入日期的年份,还可能踩跨年周的坑(比如12月底的周日可能属于下一年的第一周)。
下面给你两种靠谱的优化方案,都能完美处理周日输入的情况:
方案一:直接定位周日起始点(推荐)
这个思路最直观,先找到输入日期所在周的周日(如果输入本身是周日就用当天,否则回退到上一个周日),然后依次生成后续6天的日期,完全避开ISO周的规则陷阱:
$days = array(); $ddate = "2018-01-07"; // 测试用的周日日期 $date = new DateTime($ddate); // 找到当前日期对应的周日:如果当前是周日则不变,否则回到上一个周日 $date->modify('last Sunday'); // 特殊处理1月1日是周日的情况:此时last Sunday会跳到去年12月,需要调回当前周日 if ($date->format('Y-m-d') > $ddate) { $date->modify('+7 days'); } // 循环生成周日到周六的日期 for ($day = 0; $day <= 6; $day++) { $days[$day] = $date->format('Y-m-d'); $date->modify('+1 day'); } print_r($days);
方案二:修正ISO周的适配逻辑
如果你想保留原有的周数计算思路,需要调整ISO周的年份和周数匹配逻辑,因为ISO周的年份可能和输入日期的年份不一致,而且周日属于上一个ISO周,需要手动调整周数:
$days = array(); $ddate = "2018-01-07"; $date = new DateTime($ddate); // 用`o`获取ISO周对应的年份(而非输入日期的年份`Y`),`W`获取ISO周数 $weekYear = $date->format('o'); $weekNumber = $date->format('W'); // 如果输入是周日,需要把周数加1(因为ISO周的周日属于上一周,我们要的是当前周日所在的周日-周六周) if ($date->format('w') == 0) { // `w`格式符:0=周日,1=周一...6=周六 $weekNumber++; // 处理跨年周边界:比如12月最后一个周日,周数加1后可能超过当年最大周数,需重置为1并年份+1 if ($weekNumber > date('W', strtotime("$weekYear-12-31"))) { $weekNumber = 1; $weekYear++; } } echo "Weeknummer: $weekNumber"."<br>"; echo "Year: $weekYear"."<br>"; // 生成周日到周六的日期:ISO周的1代表周一,所以周日=周一-1天,周六=周一+5天 for ($day = 0; $day <= 6; $day++) { $days[$day] = date('Y-m-d', strtotime("$weekYear-W$weekNumber-1 + ".($day-1)." days")); } print_r($days);
为什么方案一更推荐?
方案一不需要纠结ISO周的复杂规则,直接通过日期修改来定位起始点,代码更简洁,也不容易出错,完全贴合你"周日至周六"的周定义需求。
内容的提问来源于stack exchange,提问作者vasdev chandrakar
相关产品推荐
相关产品推荐

