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

如何使用PHP根据起止时间和时长间隔生成时间区间数组?

生成课程时间区间数组的PHP实现

需求说明

现有变量定义:

$course_hour = 1; $starttime = '07:00'; $endtime = '16:00';

需要根据$course_hour的不同值,生成对应的时间区间数组:

  • 当$course_hour = 1;时,返回:
$return_array = array('07:00 - 08:00', '08:00 - 09:00', '09:00 - 10:00', '10:00 - 11:00', '11:00 - 12:00', '12:00 - 13:00', '13:00 - 14:00', '14:00 - 15:00', '15:00 - 16:00');
  • 当$course_hour = 1.5;时,返回:
$return_array = array('07:00 - 08:30', '08:30 - 10:00', '10:00 - 11:30', '11:30 - 13:00', '13:00 - 14:30', '14:30 - 16:00');
  • 当$course_hour = 2;时,返回:
$return_array = array('07:00 - 09:00', '09:00 - 11:00', '11:00 - 13:00', '13:00 - 15:00');

现有函数问题

当前提供的函数只能生成带<br/>标签的单个时间点,无法生成需求中的时间区间格式,逻辑不符合要求:

function get_session_times($course_hour, $start_time, $end_time){
    if(strlen($start_time) < 5) $start_time = '0'.$start_time;
    if(strlen($end_time) < 5) $end_time = '0'.$end_time;
    $current_time = date("Y-m-d H:i");
    $session_starttime = date("Y-m-d H:i", strtotime(date("Y-m-d ").$start_time));
    $session_endtime = date("Y-m-d H:i", strtotime(date("Y-m-d ").$end_time));
    $session_starttime_ms = strtotime($session_starttime);
    $session_endtime_ms = strtotime($session_endtime);
    $session_times_array = array();
    for ($i = $session_starttime_ms; $i < $session_endtime_ms; ) { 
         $session_times_array[] = date("H:i", $i)."<br/>"; 
         $i = $i + ($course_hour * 60 * 60);
    }
    return $session_times_array;
}

修正后的实现

下面是完全满足需求的函数代码:

function get_session_times($course_hour, $start_time, $end_time) {
    // 补全时间格式为HH:ii
    if (strlen($start_time) < 5) {
        $start_time = '0' . $start_time;
    }
    if (strlen($end_time) < 5) {
        $end_time = '0' . $end_time;
    }

    // 转换为当天的时间戳
    $today = date("Y-m-d ");
    $current_start = strtotime($today . $start_time);
    $session_end = strtotime($today . $end_time);

    $interval_seconds = $course_hour * 60 * 60;
    $times_array = [];

    while ($current_start < $session_end) {
        $current_end = $current_start + $interval_seconds;
        // 确保区间结束时间不超过总结束时间
        if ($current_end > $session_end) {
            break;
        }
        // 匹配需求的时间格式:分钟为00时显示HH:i,非00时显示G:i(去掉前导0)
        $start_str = date("H:i", $current_start);
        $end_str = date((date("i", $current_end) == '00') ? "H:i" : "G:i", $current_end);
        $times_array[] = "$start_str - $end_str";
        
        $current_start = $current_end;
    }

    return $times_array;
}

关键逻辑说明

  1. 核心是循环计算每个区间的开始/结束时间戳,拼接成开始时间 - 结束时间的字符串
  2. 针对分钟非00的场景,自动去掉小时的前导0,和需求示例格式完全匹配
  3. 加入边界判断,避免最后一个区间超出设定的总结束时间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:01:09