如何按午夜拆分跨天的PHP DateTime时间区间?
如何用PHP DateTime拆分跨天的时间区间
可以实现,借助PHP原生DateTime类的日期对比、对象克隆和时间修改方法,就能轻松完成跨天时间区间的拆分。
实现思路
- 对比起始时间和结束时间的日期部分,判断是否跨天
- 若跨天:
- 第一个区间:从原起始时间到次日00:00
- 第二个区间:从次日00:00到原结束时间
- 注意
DateTime是引用类型对象,操作时必须用clone避免修改原对象
完整代码示例
function splitCrossDayDateTimeRange(\DateTime $from, \DateTime $to): array { $ranges = []; // 判断时间区间是否跨天 if ($from->format('Y-m-d') !== $to->format('Y-m-d')) { // 生成第一个区间的结束时间:次日00:00 $firstRangeEnd = (clone $from)->modify('tomorrow')->setTime(0, 0, 0); $ranges[] = [ 'DATE_TIME_FROM' => clone $from, 'DATE_TIME_TO' => $firstRangeEnd ]; // 生成第二个区间的起始时间与原结束时间匹配 $ranges[] = [ 'DATE_TIME_FROM' => clone $firstRangeEnd, 'DATE_TIME_TO' => clone $to ]; } else { // 不跨天则直接返回原区间 $ranges[] = [ 'DATE_TIME_FROM' => clone $from, 'DATE_TIME_TO' => clone $to ]; } return $ranges; } // 测试用例 $testFrom = new \DateTime('2021-01-01 10:00'); $testTo = new \DateTime('2021-01-02 01:00'); $splitResult = splitCrossDayDateTimeRange($testFrom, $testTo); // 输出拆分后的区间 foreach ($splitResult as $index => $range) { echo "区间" . ($index + 1) . ":\n"; echo "DATE_TIME_FROM: " . $range['DATE_TIME_FROM']->format('Y-m-d H:i:s') . "\n"; echo "DATE_TIME_TO: " . $range['DATE_TIME_TO']->format('Y-m-d H:i:s') . "\n\n"; }
代码说明
- 使用
clone处理DateTime对象,避免原时间被意外修改 - 用
modify('tomorrow')->setTime(0,0,0)精准获取次日零点,比手动计算日期更可靠 - 函数兼容跨天与非跨天场景,返回格式统一的区间数组
内容的提问来源于stack exchange,提问作者Viacheslav Ravdin
相关产品推荐
相关产品推荐

