【发布时间】:2012-11-03 11:03:27
【问题描述】:
我正在尝试确定 PHP 中的两个时间范围是否重叠。在我最初的尝试中,我一直在参考Determine Whether Two Date Ranges Overlap,但是,它并不符合所有情况。如果一个时间范围嵌套在另一个时间范围的开始时间和结束时间之间,则它不会被匹配。如果它与班次的开始或结束重叠,或者班次完全匹配,则它按预期工作。
看看我在说什么的这张图片:
基本上,如果橙色变化与任何地方的红色变化重叠,我会尝试隐藏它们。这是我试图用来实现这一点的相关代码部分。
if(($red['start'] <= $orange['end']) && ($red['end'] >= $orange['start'])) {
//Conflict handling
}
变量的值是 UNIX 时间戳。从逻辑上处理这些数字,我理解为什么上面的陈述失败了。显然,我可以做更多的逻辑来确定一个班次是否属于另一个班次(这是我可能需要做的),但我希望有一个更普遍的捕获。
编辑:添加每个块的开始和结束时间的值。我同意我的应该工作。事实上,它不是我的问题所在。我可能忽略了一些愚蠢的事情。
orange-start = 1352899800
orange-end = 1352907000
red-start = 1352923200
red-end = 1352926200
因此我的逻辑是:
if((1352923200 <= 1352907000) && (1352926200 >= 1352899800))
因此,第一次比较失败。
编辑 2: 看起来我的逻辑是合理的(我认为是这种情况),我的问题与 UNIX 时间戳有关,与显示的实际时间不匹配。我感谢那些与我一起工作的人,并帮助我发现问题所在。我希望我能同时接受 Andrey 和 Jason 的回答。
【问题讨论】:
-
在你的例子中 red.start is 低于 orange.end 而 red.end is 优于 orange.start...
-
+1,有兴趣看看有 200 多票赞成的答案是否有 错误。
-
从来没有说过它有错误,它的答案是正确的。我对答案的使用是问题所在。查看下面的答案进一步巩固了这一点,我现在正在尝试。
-
你的逻辑应该起作用。你能发布
$red和$orange的值吗? -
@Michael Irigoyen:您作为示例提供的范围不重叠。橙色以
1352907000结束,而红色以1352923200开始,后者更晚。没有冲突。所以比较失败了,因为它应该。