首页 > 解决方案 > 检查 2 个日期期间是否重叠时输出错误

问题描述

我正在尝试创建一个函数来检查 2 个日期期间是否重叠。例如:

1 July 2019 - 5th July 2019并将在 2 个日期期间重叠2nd July 2019 - 4th July 2019时返回true

1 July 2019 - 5th July 2019并且13th July 2019 - 24th July 2019false因为 2 个日期期间不重叠而返回

当我比较这两个日期 24 March 2019 - 27 March 201927 March 2019 - 29 March 2019. 我得到了答案false。虽然答案应该是true因为我包括所有天数。

我怎样才能解决这个问题?

import java.time.LocalDate;
import java.time.Month;

public class TestClass {

    public static void main(String[] args) {
        LocalDate start1 = LocalDate.of(2019, Month.MARCH, 24);
        LocalDate end1 = LocalDate.of(2019, Month.MARCH, 27);
        LocalDate start2 = LocalDate.of(2019, Month.MARCH, 27);
        LocalDate end2 = LocalDate.of(2019, Month.MARCH, 29);

        boolean ans = dateOverlaps(start1, end1, start2, end2);
        System.out.println(ans);

    }

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

标签: javaif-statementtimebooleanlocaldate

解决方案


对于条件的第一部分,您确实需要在之前或之后,对于第二部分,您确实需要在之前或之后(因为包括您的开始和结束日期)。没有一种方法可以做到这一点,但有几种方法可以将其放入代码中。例如:

    return (start2.isBefore(end1) || start2.isEqual(end1)) 
            && (end2.isEqual(start1) || end2.isAfter(start1)); 

通过此更改,您的程序将打印:

真的

就我个人而言,我更喜欢较短但也有点棘手:

    return ! (start2.isAfter(end1) || end2.isBefore(start1)); 

结果是一样的。我已经颠倒了逻辑:如果周期 2 都不是在周期 1 之后,或者相反,周期重叠。


推荐阅读