检查 2 个日期期间是否重叠时输出错误
Getting wrong output when checking if 2 date periods overlap
我正在尝试创建一个函数来检查 2 个日期周期是否重叠。例如:
1 July 2019 - 5th July 2019
和 2nd July 2019 - 4th July 2019
会 return true
因为 2 个日期周期重叠
1 July 2019 - 5th July 2019
和 13th July 2019 - 24th July 2019
会 return false
因为 2 个日期周期不重叠
我比较这两个日期时得到了错误的答案
24 March 2019 - 27 March 2019
和 27 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);
}
}
对于条件的第一部分,您确实需要 before or on,第二部分同样需要 on or after(因为您包括开始日期和结束日期)。没有一种方法可以做到这一点,但有几种方法可以将其放入代码中。例如:
return (start2.isBefore(end1) || start2.isEqual(end1))
&& (end2.isEqual(start1) || end2.isAfter(start1));
通过此更改,您的程序打印:
true
就我个人而言,我更喜欢较短但也有点棘手的方法:
return ! (start2.isAfter(end1) || end2.isBefore(start1));
结果是一样的。我已经颠倒了逻辑:如果第 2 期既不是在第 1 期之后也不出现在第 1 期之后,则周期重叠。
我正在尝试创建一个函数来检查 2 个日期周期是否重叠。例如:
1 July 2019 - 5th July 2019
和 2nd July 2019 - 4th July 2019
会 return true
因为 2 个日期周期重叠
1 July 2019 - 5th July 2019
和 13th July 2019 - 24th July 2019
会 return false
因为 2 个日期周期不重叠
我比较这两个日期时得到了错误的答案
24 March 2019 - 27 March 2019
和 27 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);
}
}
对于条件的第一部分,您确实需要 before or on,第二部分同样需要 on or after(因为您包括开始日期和结束日期)。没有一种方法可以做到这一点,但有几种方法可以将其放入代码中。例如:
return (start2.isBefore(end1) || start2.isEqual(end1))
&& (end2.isEqual(start1) || end2.isAfter(start1));
通过此更改,您的程序打印:
true
就我个人而言,我更喜欢较短但也有点棘手的方法:
return ! (start2.isAfter(end1) || end2.isBefore(start1));
结果是一样的。我已经颠倒了逻辑:如果第 2 期既不是在第 1 期之后也不出现在第 1 期之后,则周期重叠。