如何使用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; }
关键逻辑说明
- 核心是循环计算每个区间的开始/结束时间戳,拼接成
开始时间 - 结束时间的字符串 - 针对分钟非00的场景,自动去掉小时的前导0,和需求示例格式完全匹配
- 加入边界判断,避免最后一个区间超出设定的总结束时间
内容的提问来源于stack exchange,提问作者Sanjoy
相关产品推荐
相关产品推荐

