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

