因此我创建了一个名为isDateOverlapping
的函数。接收(所有类型LocalDate
):
此功能的作用是告诉我两个日期段是否重叠。
例如,如果我有一个距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;
}
答案 0 :(得分:4)
最简单的理解方法是考虑两种4种可能性:
它们可以说明如下:
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 <= end1
和start2 <= end2
。如果并非总是这样,则必须检查一下,并在检查上述条件之前,如有必要,将startN与endN交换。
答案 1 :(得分:0)
确定两个日期周期仅在逻辑上重叠以下是否足够。
(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)