如何检查一个日期段是否与另一个日期段重叠

时间:2019-06-24 08:44:33

标签: java if-statement time boolean localdate

因此我创建了一个名为isDateOverlapping的函数。接收(所有类型LocalDate):

  • 开始日期1
  • 结束日期1
  • 开始日期2
  • 结束日期2

此功能的作用是告诉我两个日期段是否重叠。

例如,如果我有一个距2019-06-15 to 2019-06-18的时间段和另一个距2019-06-15 to 2019-06-12的时间段。因为两个日期段重叠,所以它将返回true。

但是,我的函数似乎并不总是返回正确的答案。你能帮忙吗?

public boolean isDateOverlapping(LocalDate start1, LocalDate end1, LocalDate start2, LocalDate end2) {

    if (start1.isAfter(start2) && start2.isBefore(start1)) {
        return true;

    } else if (end1.isBefore(end2) && start1.isAfter(start2)) {
        return true;
    } else if (start1.isAfter(end1) && end2.isBefore(start2)) {
        return true;
    }

    return false;

}

2 个答案:

答案 0 :(得分:4)

最简单的理解方法是考虑两种4种可能性:

  1. 第二个间隔包含第一个间隔:s2
  2. 第二个间隔包含第一个间隔的开始:s2
  3. 第二个间隔包含第一个间隔的结尾:s1
  4. 第二个间隔包含在第一个间隔中:s1

它们可以说明如下:

        1.                  2.                    3.               4.

|---------------|       |-------|                |------|        |----|     Second Interval
     |-----|                 |------|        |-------|       |-----------|  First Interval
s2   s1    e1   e2      s2   s1 e2  e1      s1  s2   e1 e2   s1  s2  e2  e1

所有这4种情况的共同不变性是第二个间隔必须在第一个间隔结束之前开始,而第二个间隔必须在第一个间隔开始之后结束。

这给您:

public boolean isDateOverlapping(LocalDate start1, LocalDate end1, LocalDate start2, LocalDate end2) {
    return start2.isBefore(end1) && end2.isAfter(start1); 
}

请注意,如果您希望方法在间隔重叠在单个点上时返回true,则可能需要进行一些更改。在这种情况下,您需要将start2.isBefore(end1)替换为!start2.isAfter(end1),将end2.isAfter(start1)替换为!end2.isBefore(start1)

还要注意,我假设使用start1 <= end1start2 <= end2。如果并非总是这样,则必须检查一下,并在检查上述条件之前,如有必要,将startN与endN交换。

答案 1 :(得分:0)

确定两个日期周期仅在逻辑上重叠以下是否足够。

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)