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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:03