重叠两个日期/时间范围 - PHP

时间:2017-01-23 19:04:41

标签: php logic

我试图确定两组日期/时间范围是否重叠---返回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

2 个答案:

答案 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"))
       );
?>