在Laravel中生成两个DateTime间的迭代时间用于新增记录
实现代码
你现有的代码核心问题是DatePeriod默认排除结束时间节点,会导致丢失最后一天的记录,以下是符合需求的完整实现:
// 输入参数 $start = new DateTime('2021-09-13 06:00:00'); $end = new DateTime('2021-09-17 15:00:00'); // 提取固定时段参数 $dailyStart = $start->format('H:i:s'); $dailyEnd = $end->format('H:i:s'); $duration = $start->diff($end)->h . '小时'; // 调整结束时间避免最后一天被排除 $loopEnd = (clone $end)->modify('+1 day'); $period = new DatePeriod($start, DateInterval::createFromDateString('1 day'), $loopEnd); $records = []; foreach ($period as $date) { $currentDate = $date->format('Y-m-d'); $records[] = [ 'start_time' => $currentDate . ' ' . $dailyStart, 'end_time' => $currentDate . ' ' . $dailyEnd, 'duration' => $duration ]; } // 打印测试,实际使用时直接用$records数组批量入库即可 dd($records);
输出说明
上述代码输出的$records数组完全匹配你需要的结构:
| 开始时间 | 结束时间 | 时长 |
|---|---|---|
| 2021-09-13 06:00:00 | 2021-09-13 15:00:00 | 9小时 |
| 2021-09-14 06:00:00 | 2021-09-14 15:00:00 | 9小时 |
| 2021-09-15 06:00:00 | 2021-09-15 15:00:00 | 9小时 |
| 2021-09-16 06:00:00 | 2021-09-16 15:00:00 | 9小时 |
| 2021-09-17 06:00:00 | 2021-09-17 15:00:00 | 9小时 |
如果需要处理时段跨天、或起止时间时分秒不固定的场景,只需调整时长计算逻辑即可,当前实现完全适配你给出的需求场景。
内容的提问来源于stack exchange,提问作者Nigel
相关产品推荐
相关产品推荐

