两个时间段重叠判断算法

Posted by 陶之11@Works,Program,Scripts

在日常做项目中我们会遇到很多与时间相关的一些检测。
如一个酒店的钟占房订单系统,须要计算出一个时间段内是否与一个或多个时间段是否重叠的例子。
用php的实现方法,直接看源代码

<?php
/**
 * [Detection_Overlap_DateTime description]
 * @param  [datetime] $starttime        [开始时间]
 * @param  [datetime] $endtime          [结束时间]
 * @param  [array]  $exist_time_array   [已存在时间数组]
 * @return [Boole]                      [时间冲突返回true]
 * @author [陶之11] <11@pao11.com>
 */
function Detection_Overlap_DateTime($starttime = null, $endtime = null, $exist_time_array = array())
{
    //将时间转换成unix时间戳
    $gstime = ctype_digit($starttime) && $starttime <= 2147483647 ? $starttime : strtotime($starttime);
    $getime = ctype_digit($endtime) && $endtime <= 2147483647 ? $endtime : strtotime($endtime);

    $i = 0;
    //将新加入时间做new标记
    $_array = array($gstime=>'new',$getime=>'new');

    //循环已存在时间并转成unix时间戳
    foreach($exist_time_array as  $v){
        $i++;
        //对已存在时间做标记,把时间戳设为数组键名
        $_array[strtotime($v['stime'])] = $i;
        $_array[strtotime($v['etime'])] = $i;
    }

    ksort($_array);//然后按时间戳排序
    reset($_array);//重置数组
    print_r($_array);
    while(key($_array) != $gstime) next($_array);
    if(next($_array)!='new'){
        return true;
    }

    reset($_array);
    while(key($_array) != $getime) next($_array);
    if(prev($_array)!='new'){
        return true;
    }
    return false;
}

以上带代码用数组排序功能实现了整个算法,其中数组的ksort next prev等方法是该算法的核心。
可以看看调用示例

<?php
//已存在时间段数组
$datetime  = array(
        array('stime'=>'2015-06-26 10:12:12','etime'=>'2015-06-26 10:50:15'),
        array('stime'=>'2015-06-26 11:00:00','etime'=>'2015-06-26 11:20:00'),
        array('stime'=>'2015-06-26 12:11:00','etime'=>'2015-06-26 13:30:00')
               );


//假如要插入一段时间
$stime = '2015-06-26 13:30:01';
$etime = '2015-06-26 14:00:00';

//检查时间段是否冲突
var_dump(Detection_Overlap_DateTime($stime, $etime, $datetime));

结果将返回false 因为$stime中的13:30:01与$datetime中的最后一条有重叠。

相关文章:


仅有一条评论 »

  1. ewd

    对于交叉时间点算法很有用。

Feedback

(必填)

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。



about me

  • 陶之11's Blog Name:陶之11 OICQ:14779023 Site:Pao11.com

分类

快捷入口