参考网址 https://www.kancloud.cn/xiaobaoxuetp/mywork/3069416
https://segmentfault.com/a/1190000020487996
PHP判断多个时间段是否存在跨天或重复叠加的场景
/**
* PHP计算两个时间段是否有交集(边界重叠不算)
*
* @param string $beginTime1 开始时间1
* @param string $endTime1 结束时间1
* @param string $beginTime2 开始时间2
* @param string $endTime2 结束时间2
* @return bool
*/
function is_time_cross($beginTime1 = '', $endTime1 = '', $beginTime2 = '', $endTime2 = '') {
$status = $beginTime2 - $beginTime1;
if ($status > 0) {
$status2 = $beginTime2 - $endTime1;
if ($status2 >= 0) {
return false;
} else {
return true;
}
} else {
$status2 = $endTime2 - $beginTime1;
if ($status2 > 0) {
return true;
} else {
return false;
}
}
}
$list = array(
array('start_s'=>'10:00', 'end_s'=>'12:30'),
array('start_s'=>'11:00', 'end_s'=>'12:30'),
array('start_s'=>'14:00', 'end_s'=>'12:30'),
array('start_s'=>'16:00', 'end_s'=>'12:30'),
);
$array = array();
foreach ($list as $k => $v) {
// 时间转换成秒
$start = explode(':', $v['start_s']);
$end = explode(':', $v['end_s']);
$start_time = $start[0]*3600+$start[1]*60;
$end_time = $end[0]*3600+$end[1]*60;
// 更新进新列表
$array[] = array(
'start_s'=>$start_time,
'end_s'=>$end_time,
);
// 先判断有没有跨天
if ($v['start_s'] > $v['end_s']) {
$str = '存在跨天时间段:';
$str .= '开始时间:'.$v['start_s'];
$str .= ' 结束时间:'.$v['end_s'];
die($str);
}
}
// 判断天数重叠
foreach ($array as $k => $v) {
foreach ($array as $kk => $vv) {
if ($kk != $k) {
// 存在跨天时间段
if (is_time_cross($v['start_s'], $v['end_s'], $vv['start_s'], $vv['end_s'])) {
$str = '存在重叠时间段:';
$str .= '开始时间:'.date('H:i', $v['start_s']);
$str .= ' 结束时间:'.date('H:i', $v['end_s']);
$str .= ' 《 对应 》 开始时间:'.date('H:i', $vv['start_s']);
$str .= ' 结束时间:'.date('H:i', $vv['end_s']);
die($str);
}
}
}
}