我正在尝试计算PHP中的两个时间范围是否重叠。我已经提到确定是否两个日期范围重叠了我最初的尝试,但是,它不匹配的所有情况。如果某个时间范围嵌套在另一个时间范围的开始时间和结束时间之间,则不会匹配该时间范围。如果它与班次的开始或结束重叠,或者班次完全匹配,则按预期工作。
看看我在说什么的这张图片:
基本上,如果任何地方的橙色班次重叠,我都会尝试隐藏它们。这是我要用来实现此目的的相关代码部分。
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时间戳有关的东西与显示的实际时间不匹配。我感谢那些为此工作的人,并帮助我发现这是问题所在。我希望我能接受安德烈和杰森的回答。
逻辑是正确的。您提供的$red(8-8:50pm)和$orange(1:30-3:30pm)时间戳 不重叠 。
$red
$orange
给定正确的值(反映您的屏幕截图),实际上可以找到重叠部分:
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'; }
我的猜测是您遇到了时区转换问题。