Java 检查两个日期周期是否重叠时输出错误

Java 检查两个日期周期是否重叠时输出错误,java,if-statement,time,boolean,localdate,Java,If Statement,Time,Boolean,Localdate,我试图做一个函数,检查两个日期周期是否重叠。例如: return (start2.isBefore(end1) || start2.isEqual(end1)) && (end2.isEqual(start1) || end2.isAfter(start1)); 2019年7月1日至2019年7月5日和2019年7月2日至2019年7月4日将返回true,因为两个日期周期重叠 2019年7月1日至2019年7月5日和2019年7月13日至20

我试图做一个函数,检查两个日期周期是否重叠。例如:

    return (start2.isBefore(end1) || start2.isEqual(end1)) 
            && (end2.isEqual(start1) || end2.isAfter(start1)); 
2019年7月1日至2019年7月5日
2019年7月2日至2019年7月4日
将返回
true
,因为两个日期周期重叠

2019年7月1日至2019年7月5日
2019年7月13日至2019年7月24日
将返回
false
,因为这两个日期段不重叠

当我比较这两个日期时,我得到了错误的答案
2019年3月24日至2019年3月27日
2019年3月27日至2019年3月29日
。我得到了答案
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); 
    }
}
对于条件的第一部分,您确实需要在之前或之后,对于第二部分,您同样需要在之后或之前(因为您的开始日期和结束日期都包含在内)。没有一种方法可以做到这一点,但有几种方法可以将其转化为代码。例如:

    return (start2.isBefore(end1) || start2.isEqual(end1)) 
            && (end2.isEqual(start1) || end2.isAfter(start1)); 
通过此更改,您的程序将打印:

真的

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

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

结果是一样的。我把逻辑颠倒过来了:如果周期2既不在周期1之后,也不在周期1之后,则周期重叠。

@OleV.V。我不认为可以使用LocalDate函数实现这一点。请注意,Guava有一个
范围
类,可以对you@smac89我不想用其他的libraries@T04435我明白你的意思了,链接很有用。然而,这个问题中的代码已经在尝试实现这里给出的算法,ljnk似乎没有解释为什么它在这个特定情况下不能正常工作。所以我建议它不是复制品。