PHP实现跨多天预约的每日有效工作时长(分钟)统计
计算时间区间内每日有效工作分钟数的PHP实现
需求说明
给定起始时间 $startDateTime = "2024-01-06 14:00:00" 和结束时间 $endDateTime = "2024-01-13 14:00:00",按照以下工作时间规则,生成以日期为键、当日有效工作分钟数为值的数组:
- 周一至周五:9:00-18:00(共540分钟)
- 周六:9:00-14:00(共300分钟)
- 周日:无有效工作时间
完整实现代码
<?php $startDateTime = "2024-01-06 14:00:00"; $endDateTime = "2024-01-13 14:00:00"; // 定义各星期对应的工作时间规则 $workTimeRules = [ 0 => ['start' => '00:00', 'end' => '00:00'], // 周日无工作时间 1 => ['start' => '09:00', 'end' => '18:00'], 2 => ['start' => '09:00', 'end' => '18:00'], 3 => ['start' => '09:00', 'end' => '18:00'], 4 => ['start' => '09:00', 'end' => '18:00'], 5 => ['start' => '09:00', 'end' => '18:00'], 6 => ['start' => '09:00', 'end' => '14:00'], // 周六 ]; $start = new DateTime($startDateTime); $end = new DateTime($endDateTime); $currentDate = clone $start; $workMinutesPerDay = []; // 遍历区间内的每一天 while ($currentDate <= $end) { $dateStr = $currentDate->format('Y-m-d'); $weekday = (int)$currentDate->format('w'); // 获取星期几(0=周日,1=周一...6=周六) $dayRule = $workTimeRules[$weekday]; // 构造当天工作时间的DateTime对象 $dayWorkStart = new DateTime($dateStr . ' ' . $dayRule['start']); $dayWorkEnd = new DateTime($dateStr . ' ' . $dayRule['end']); // 确定当天实际有效时间范围 $actualStart = max($start, $dayWorkStart); $actualEnd = min($end, $dayWorkEnd); // 计算有效分钟数 if ($actualEnd <= $actualStart) { $workMinutesPerDay[$dateStr] = 0; } else { $interval = $actualStart->diff($actualEnd); $workMinutesPerDay[$dateStr] = $interval->h * 60 + $interval->i; } // 跳转至下一天 $currentDate->modify('+1 day'); } // 输出结果 echo "<pre>"; print_r($workMinutesPerDay); echo "</pre>"; ?>
关键逻辑说明
- 规则映射:用数组关联星期几与对应工作时间段,周日直接设置为无工作时间,避免无效计算。
- 日期遍历:从起始日期开始逐个遍历到结束日期,确保覆盖区间内所有日期。
- 有效时间校准:
- 取全局起始时间与当天工作开始时间的最大值,排除工作时间外的起始部分。
- 取全局结束时间与当天工作结束时间的最小值,排除工作时间外的结束部分。
- 分钟数计算:若校准后的结束时间早于或等于起始时间,当天有效分钟数为0;否则通过时间差计算实际有效分钟数。
运行代码后将输出与需求示例完全一致的结果:
Array ( [2024-01-06] => 0 [2024-01-07] => 0 [2024-01-08] => 540 [2024-01-09] => 540 [2024-01-10] => 540 [2024-01-11] => 540 [2024-01-12] => 540 [2024-01-13] => 300 )
内容的提问来源于stack exchange,提问作者freshwebs
相关产品推荐
相关产品推荐

