可能重复:
确定两个日期范围是否重叠
我想弄清楚如果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时间戳相关的东西与实际显示的时间不匹配.我感谢那些和我一起工作过的人,并帮助我发现这个问题.我希望我能接受安德烈和杰森的答案.
如果您有两个范围[b1, e1]
并且[b2, e2]
(已经建立了b1 < e1
和b2 < 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您在编辑中提供的样本范围不重叠,您的比较正确地将其识别为无冲突情况.即一切都按预期工作.你在哪里看到这个问题?
逻辑是正确的.您提供的时间戳$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)
我的猜测是你有时区转换问题.