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

PHP实现:按分组格式展示两日期间的周末(含跨月处理)

实现两个日期之间的周末分组展示

刚好之前做过类似的需求,核心就是要把同月份的周六周日合并展示,跨月份的就分开列。直接上代码,我再拆解关键逻辑:

<?php
$start = strtotime(date('Y-m-d'));
$end = strtotime("2018-06-12");

$weekends = [];
$currentSat = null; // 存储当前捕获到的周六时间戳

for ($i = $start; $i <= $end; $i = strtotime("+1 day", $i)) {
    $dayOfWeek = date('w', $i); // 0=周日, 1=周一...6=周六

    // 处理周六,记录下当前周六的时间戳
    if ($dayOfWeek == 6) {
        $currentSat = $i;
    }

    // 处理周日,或者循环结束时剩下的未配对周六
    if (($dayOfWeek == 0 && $currentSat !== null) || ($i == $end && $currentSat !== null)) {
        if ($dayOfWeek == 0) {
            $currentSun = $i;
            // 判断周六和周日是否属于同一个月
            if (date('Ym', $currentSat) == date('Ym', $currentSun)) {
                // 同月份,合并成一条展示
                $satDay = date('j', $currentSat);
                $sunDay = date('j', $currentSun);
                $monthYearStr = date('Y年n月', $currentSat);
                $weekends[] = "周六和周日 - {$monthYearStr}{$satDay}-{$sunDay}日";
            } else {
                // 跨月份,分别单独展示
                $weekends[] = "周六 - " . date('Y年n月j日', $currentSat);
                $weekends[] = "周日 - " . date('Y年n月j日', $currentSun);
            }
        } else {
            // 循环结束时刚好是周六,没有后续的周日,单独展示这条周六
            $weekends[] = "周六 - " . date('Y年n月j日', $currentSat);
        }
        // 重置周六标记,准备捕获下一个周末
        $currentSat = null;
    }
}

// 遍历输出最终结果
foreach ($weekends as $item) {
    echo $item . PHP_EOL;
}
?>

关键逻辑拆解:

  • 状态跟踪:用$currentSat变量临时记录遇到的周六,方便和后续的周日配对判断,避免遗漏或重复。
  • 跨月判断:通过date('Ym', $time)获取「年份+月份」的数字组合(比如201803),对比周六和周日的这个值,就能快速判断是否跨月。
  • 边界处理:考虑到循环结束时可能刚好停在周六(没有后续的周日可以配对),单独做了分支处理,避免遗漏这个周六。
  • 日期格式化:用date('Y年n月j日')生成符合需求的中文日期格式,其中n是不带前导零的月份,j是不带前导零的日期,和示例输出完全匹配。

运行这段代码后,就能得到你期望的输出效果:

周六和周日 - 2018年3月24-25日
周六 - 2018年3月31日
周日 - 2018年4月1日
周六和周日 - 2018年4月7-8日
......

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:50