确定两个时间范围是否在任何点重叠

Mic*_*yen 12 php algorithm

可能重复:
确定两个日期范围是否重叠

我想弄清楚如果PHP中的两个时间范围重叠.我一直指的是确定我的初始尝试是否有两个日期范围重叠,但是,它并不匹配所有情况.如果时间范围嵌套在另一个时间范围的开始和结束时间之间,则它不匹配.如果它与班次的开始或结束重叠,或者如果班次完全匹配,则按预期工作.

看看我正在谈论的这张图片:

在此输入图像描述

基本上,如果它们在任何地方重叠任何红色变化,我试图隐藏任何橙色变化.这是我试图用来实现这一目标的相关代码部分.

if(($red['start'] <= $orange['end']) && ($red['end'] >= $orange['start'])) {
    //Conflict handling
}
Run Code Online (Sandbox Code Playgroud)

变量的值是UNIX时间戳.从逻辑上理解数字,我理解为什么上面的陈述失败了.很明显,我可以采用更多逻辑来确定一个班次是否属于另一个班次(这是我可能需要做的事情),但我希望有一个更普遍的问题.

编辑:添加每个块的开始和结束时间的值.我同意我应该做的工作.它不是我的问题所在.我可能忽视了一些愚蠢的事情.

orange-start = 1352899800
orange-end = 1352907000

red-start = 1352923200
red-end = 1352926200
Run Code Online (Sandbox Code Playgroud)

因此我的逻辑会说:

if((1352923200 <= 1352907000) && (1352926200 >= 1352899800))
Run Code Online (Sandbox Code Playgroud)

因此,第一次比较失败.

编辑2:看起来我的逻辑是合理的(我认为是这种情况),我的问题是与UNIX时间戳相关的东西与实际显示的时间不匹配.我感谢那些和我一起工作过的人,并帮助我发现这个问题.我希望我能接受安德烈和杰森的答案.

AnT*_*AnT 8

如果您有两个范围[b1, e1]并且[b2, e2](已经建立了b1 < e1b2 < e2),则通过以下逻辑表达式检测重叠

not (e2 < b1 or e1 < b2)
Run Code Online (Sandbox Code Playgroud)

可以改写为

e2 >= b1 and e1 >= b2
Run Code Online (Sandbox Code Playgroud)

在你的语法中

if(($orange['end'] >= $red['start']) && ($red['end'] >= $orange['start'])) {
   //Conflict handling
}
Run Code Online (Sandbox Code Playgroud)

也就是你说得对.为什么你声称"在逻辑上解决这些数字,我理解为什么上面的陈述失败了." 我不清楚.究竟什么失败了?(而且我不知道为什么每个人都会提出荒谬的"过度工程"检查,并进行两次以上的比较.)

当然,您必须确定触摸范围是否被视为重叠并相应地调整比较的严格性.

PS您在编辑中提供的样本范围不重叠,您的比较正确地将其识别为无冲突情况.即一切都按预期工作.你在哪里看到这个问题?


Jas*_*ary 6

逻辑是正确的.您提供的时间戳$red(8-8:50pm)和$orange(1:30-3:30pm)不重叠.

给定正确的值(反映您的屏幕截图),确实找到了重叠:

function show_date($value, $key) {
    echo $key, ': ', date('r', $value), PHP_EOL;
}

$red = array('start' => strtotime('today, 2pm'), 'end' => strtotime('today, 2:45pm'));
$orange = array('start' => strtotime('today, 1:30pm'), 'end' => strtotime('today, 4pm'));

array_walk($red, 'show_date');
array_walk($orange, 'show_date');

if (($red['start'] <= $orange['end']) && ($red['end'] >= $orange['start'])) {
    echo 'Conflict handling';
}
Run Code Online (Sandbox Code Playgroud)

我的猜测是你有时区转换问题.