我试图确定两组日期/时间范围是否重叠---返回BOOLEAN值。
请考虑以下情况:
注意:我使用24-JAN-17 07:00
strtotime()
)转换为时间戳
每个案例使用的表达式是:
$isOverlapping = (s1 < e2 && s2 < e1)
案例1 :
Let (s1, e1) be defined as (24-JAN-17 07:00, 24-JAN-17 17:00)
Let (s2, e2) be defined as (24-JAN-17 16:30, 24-JAN-17 17:30)
结果:
TRUE
(这是正确的)
案例2 :
Let (s1, e1) be defined as (24-JAN-17 07:00, 24-JAN-17 17:00)
Let (s2, e2) be defined as (24-JAN-17 16:30, 25-JAN-17 07:00)
结果:
TRUE
(这是正确的)
案例3 :
Let (s1, e1) be defined as (24-JAN-17 07:00, 24-JAN-17 17:00)
Let (s2, e2) be defined as (24-JAN-17 17:00, 25-JAN-17 07:30)
结果:
FALSE
(这是不正确的)
我的理解是这样做是因为(如果是上面的#3),它会在第二天溢出......但如果是这样的话,为什么它适用于Case 2
? (是因为重叠发生在同一天,与Case 3
相反?)
无论如何,我的问题是,如何调整我的表达式,以便它涵盖上面的案例3?
任何和所有帮助表示赞赏!谢谢!
我已经查看了以下主题,但无济于事:
Determine Whether Two Date Ranges Overlap
Determining if two time ranges overlap at any point(具体来说:https://stackoverflow.com/a/13387860/7458905)
答案 0 :(得分:1)
你的最后一个案例没有返回TRUE的原因是由于平等。
你说的是案例3:
Let (s1, e1) be defined as (24-JAN-17 07:00, 24-JAN-17 17:00)
Let (s2, e2) be defined as (24-JAN-17 17:00, 25-JAN-17 07:30)
这意味着e1
等于 s2
(他们都是24-JAN-17 17:00)
但是你的逻辑只有在s2 < e1
时才是真的,在这种情况下不是真的。
修改你的逻辑,使它在相等时返回true:
$isOverlapping = (s1 <= e2 && s2 <= e1)
答案 1 :(得分:0)
你也可以用一些简单的数学来做这个。
这里我们简单地将组件分解为它们的unix时间戳,然后使用两者的dx / dy来确定它们是否重叠
<?php
function is_overlapping($date_range_1, $date_range_2) {
// convert into unix timestamp (milliseconds since Jan 1st 1970)
$d1_1 = make_timestamp($date_range_1[0]);
$d1_2 = make_timestamp($date_range_1[1]);
$d2_1 = make_timestamp($date_range_2[0]);
$d2_2 = make_timestamp($date_range_2[1]);
// grab the delta of both ranges
$delta2 = $d2_1 - $d1_2;
$delta1 = $d2_2 - $d1_1;
// if either has a delta < 0 then they overlap
if (($delta2 < 0) || ($delta1 < 0)) { return "true"; }
// catchall return value
return "false";
}
// convert to unix timestamp function
function make_timestamp($inp_date) {
return strtotime($inp_date);
}
// test cases
print_r("Case 1: " .
is_overlapping(array("24-JAN-17 07:00", "24-JAN-17 17:00"),
array("24-JAN-17 16:30", "25-JAN-17 17:30"))
);
print_r("<br>");
print_r("Case 3: " .
is_overlapping(array("24-JAN-17 07:00", "24-JAN-17 17:00"),
array("24-JAN-17 17:30", "25-JAN-17 18:30"))
);
?>