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

标签 php algorithm

<分区>

Possible Duplicate:
Determine Whether Two Date Ranges Overlap

我正在尝试确定 PHP 中的两个时间范围是否重叠。我一直指的是 Determine Whether Two Date Ranges Overlap然而,在我最初的尝试中,它并不适合所有情况。如果一个时间范围嵌套在另一个时间范围的开始时间和结束时间之间,则不匹配。如果它与类次的开始或结束重叠,或者如果类次完全匹配,它将按预期工作。

看看我所说的这张图片:

enter image description here

基本上,如果任何橙色偏移在任何地方与任何红色偏移重叠,我都会尝试隐藏它们。这是我试图用来实现这一目标的代码的相关部分。

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

变量的值是 UNIX 时间戳。从逻辑上研究这些数字,我明白为什么上面的陈述失败了。显然,我可以通过多种方式来确定一个类次是否落在另一个类次中(这可能是我需要做的),但我希望获得更普遍的捕获。

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

orange-start = 1352899800
orange-end = 1352907000

red-start = 1352923200
red-end = 1352926200

因此我的逻辑是:

if((1352923200 <= 1352907000) && (1352926200 >= 1352899800))

所以接下来,第一次比较失败了。

编辑 2: 看起来我的逻辑是合理的(我认为是这样),我的问题是与 UNIX 时间戳有关,与显示的实际时间不匹配。我感谢那些与我一起工作并帮助我发现问题所在的人。我希望我能同时接受安德烈和杰森的回答。

最佳答案

如果您有两个范围 [b1, e1][b2, e2] (其中已经确定 b1 < e1b2 < e2 )然后通过以下逻辑表达式检测重叠

not (e2 < b1 or e1 < b2)

可以重写为

e2 >= b1 and e1 >= b2

在你的语法中是

if(($orange['end'] >= $red['start']) && ($red['end'] >= $orange['start'])) {
   //Conflict handling
}

即你做对了。 为什么你声称 “从逻辑上研究数字,我理解为什么上面的陈述失败了。” 我不清楚。究竟是什么失败了? (而且我不知道为什么每个人都会提出可笑的“过度设计”检查,并进行两次以上的比较。)

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

P.S. 您在编辑中提供的样本范围没有重叠,您的比较正确地将其识别为无冲突情况。 IE。一切正常。您在哪里看到问题?

关于php - 确定两个时间范围是否在任何一点重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13387490/

相关文章:

php - MySQL查询显示问题

algorithm - 数组中具有最小总和的索引集的特定子集

php - 对数标度 - PHP 排名

java - Kadane 算法实现返回错误结果

algorithm - 允许A-star算法绕过x个障碍物

algorithm - 如何快速找到边序列中的所有路径?

javascript - 另一个 AJAX 调用的 AJAX 按钮不起作用

php - Wamp服务器错误消息: Undefined variable: _post?

php - PHP 上的 VisualBasic Convert.FromBase64String 等效项

php - 从 php 到 javascript 的 json 对象分配有什么问题?