You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP拆分订单时间区间并生成小时数组的技术需求

解决PHP订单时间区间按小时拆分的问题

Hey there! Let's break this down step by step since you're new to PHP array manipulation. I'll walk you through how to split each order's time range into hourly entries with the hour_selected field, including handling cases where the end time crosses into the next day (like your second order ending at 01:00:00).

思路解析

  1. 遍历每个订单:逐个处理数组里的每一条订单数据
  2. 用DateTime处理时间:PHP的DateTime类能轻松处理时间计算和跨天情况,比手动字符串操作靠谱多了
  3. 处理跨天逻辑:如果订单的结束时间早于开始时间,说明这个订单的时间区间跨越到了第二天,需要给结束时间加一天
  4. 循环生成小时条目:从开始时间开始,每小时递增一次,直到达到结束时间,把每个小时的时间字符串存入结果数组

完整代码示例

<?php
// 你的原始订单数组
$orders = [
    [
        "order_id" => "7",
        "order_start_time" => "08:00:00",
        "order_end_time" => "11:00:00",
        "order_date" => "29/03/2018"
    ],
    [
        "order_id" => "8",
        "order_start_time" => "10:00:00",
        "order_end_time" => "01:00:00",
        "order_date" => "29/03/2018"
    ]
];

// 用来存放最终结果的数组
$hourlyEntries = [];

foreach ($orders as $order) {
    // 解析订单日期(注意格式是d/m/Y)
    $baseDate = DateTime::createFromFormat('d/m/Y', $order['order_date']);
    
    // 组合开始时间的完整DateTime对象
    $start = DateTime::createFromFormat('d/m/Y H:i:s', $baseDate->format('d/m/Y') . ' ' . $order['order_start_time']);
    // 组合结束时间的完整DateTime对象
    $end = DateTime::createFromFormat('d/m/Y H:i:s', $baseDate->format('d/m/Y') . ' ' . $order['order_end_time']);
    
    // 处理跨天情况:如果结束时间在开始时间之前,说明是次日的时间
    if ($end < $start) {
        $end->modify('+1 day');
    }
    
    // 从开始时间开始,逐个小时遍历到结束时间
    $current = clone $start;
    while ($current <= $end) {
        // 将当前小时添加到结果数组
        $hourlyEntries[] = [
            'hour_selected' => $current->format('H:i:s')
        ];
        
        // 时间递增1小时
        $current->modify('+1 hour');
    }
}

// 输出结果(你可以根据需求调整输出方式,比如转成JSON)
print_r($hourlyEntries);
// 如果需要JSON格式:echo json_encode($hourlyEntries);
?>

代码关键点说明

  • DateTime类的使用:避免了手动拆分时间字符串、计算小时数的繁琐,还能自动处理时区和跨天问题
  • 跨天判断:通过比较$end和$start的大小,自动给结束时间加一天,确保时间区间计算正确
  • 克隆DateTime对象:因为DateTime是引用类型,直接赋值会导致原对象被修改,所以用clone来创建副本

运行这段代码后,你会得到符合预期的数组,包含从08:00:00到11:00:00,以及10:00:00到次日01:00:00的所有小时条目。

内容的提问来源于stack exchange,提问作者HddnTHA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:27