java - 检查 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 2019
会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);
}
}
解决方案
对于条件的第一部分,您确实需要在之前或之后,对于第二部分,您确实需要在之前或之后(因为包括您的开始和结束日期)。没有一种方法可以做到这一点,但有几种方法可以将其放入代码中。例如:
return (start2.isBefore(end1) || start2.isEqual(end1))
&& (end2.isEqual(start1) || end2.isAfter(start1));
通过此更改,您的程序将打印:
真的
就我个人而言,我更喜欢较短但也有点棘手:
return ! (start2.isAfter(end1) || end2.isBefore(start1));
结果是一样的。我已经颠倒了逻辑:如果周期 2 都不是在周期 1 之后,或者相反,周期重叠。
推荐阅读
- ruby-on-rails - 垃圾邮件过滤器正在解锁点击设计可锁定电子邮件的用户
- ios - XCode 无法创建存档并出现“无法生成进程 /usr/bin/make”错误
- javascript - 将html标签放在字符串插值中
- java - 想法:使用快捷方式分配局部变量后将插入符号移动到行尾?
- flutter - 如何将 Row 的文本放在其底部?
- swift - Swift Cocoa 操纵标题栏按钮的设计
- java - IO-Link CRC32 实施
- html - 在 iframe 中将视频宽度和高度设置为 100%
- python - 如何在python中加入两个这样的列表
- c# - 无法创建类型的常量值 此上下文仅支持原始类型或枚举类型。: