有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我创建了一个名为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) 个答案

  1. # 1 楼答案

    最容易理解这一点的方法有两种:4种可能性:

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

    它们可以说明如下:

            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交换

  2. # 2 楼答案

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

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