PHP实现按周拆分指定日期范围并自定义起止日期的方法
按指定起止日期拆分日期范围为周分段的PHP函数实现
需求说明
需要实现一个PHP函数,将给定的日期范围按周拆分,但不使用每周固定的首尾日作为分段强制标准:
- 第一段以用户指定的起始日期为开始
- 中间段落为完整的自然周(可自定义周结束日,默认周日)
- 最后一段以用户指定的结束日期为收尾
比如输入:
$startDate = '2022-08-05'; $endDate = '2022-08-16';
期望得到的分段结果:
- 2022-08-05 至 2022-08-07(从指定起始日到当周周日)
- 2022-08-08 至 2022-08-14(完整自然周)
- 2022-08-15 至 2022-08-16(从下一周起始日到指定结束日)
原函数问题分析
原rangeWeek函数仅返回给定日期所在自然周的固定首尾日(周一至周日),无法适配用户指定的起止日期作为分段边界,因此需要重新实现。
解决方案:自定义分段函数
使用PHP的DateTime类处理日期(比strtotime更稳定可靠),实现按需求拆分的函数:
function splitDateRangeIntoWeeks($startDateStr, $endDateStr, $weekEndDay = 7) { // 设置时区,可根据业务需求调整 date_default_timezone_set('Asia/Shanghai'); $startDate = new DateTime($startDateStr); $endDate = new DateTime($endDateStr); $segments = []; while ($startDate <= $endDate) { // 计算当前起始日所在周的结束日(默认周日,$weekEndDay=7) $currentWeekEnd = (clone $startDate)->modify("next Sunday"); // 若当前起始日已是周日,直接设为当天 if ($currentWeekEnd->format('N') != $weekEndDay) { $currentWeekEnd = (clone $startDate)->modify("this Sunday"); } // 若周结束日超过总结束日期,替换为总结束日 if ($currentWeekEnd > $endDate) { $currentWeekEnd = clone $endDate; } // 保存当前分段 $segments[] = [ 'start' => $startDate->format('Y-m-d'), 'end' => $currentWeekEnd->format('Y-m-d') ]; // 切换到下一段的起始日(当前段结束日的次日) $startDate = (clone $currentWeekEnd)->modify('+1 day'); } return $segments; }
调用示例
$start = '2022-08-05'; $end = '2022-08-16'; $weekSegments = splitDateRangeIntoWeeks($start, $end); // 格式化输出结果 foreach ($weekSegments as $segment) { echo "{$segment['start']} to {$segment['end']}\n"; }
输出结果
2022-08-05 to 2022-08-07 2022-08-08 to 2022-08-14 2022-08-15 to 2022-08-16
自定义周结束日
如果需要将周结束日改为周六(或其他日期),只需传入第三个参数:
// 周结束日设为周六($weekEndDay=6) $weekSegments = splitDateRangeIntoWeeks($start, $end, 6);
内容的提问来源于stack exchange,提问作者Anno123
相关产品推荐
相关产品推荐

