【问题标题】:How to check if one date period overlapping another date period [duplicate]如何检查一个日期期间是否与另一个日期期间重叠[重复]
【发布时间】:2019-11-06 01:01:46
【问题描述】:

所以我创建了这个名为isDateOverlapping 的函数。它接受(所有类型的LocalDate):

  • 开始日期 1
  • 结束日期 1
  • 开始日期 2
  • 结束日期 2

这个函数的作用是告诉我两个日期是否重叠。

例如,如果我有一个来自2019-06-15 to 2019-06-18 的句点和另一个来自2019-06-15 to 2019-06-12 的句点。它将返回 true,因为 2 个日期期间重叠。

但是我的函数似乎并不总是返回正确的答案。你能帮忙吗?

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;

}

【问题讨论】:

  • 如果前期的最后一天恰好是后期的第一个日期,您是否认为一个时间段与另一个时间段重叠?这是一种边缘情况,应该在实现任何东西之前定义。
  • 从 2019 年 6 月 15 日到 2019 年 6 月 12 日的另一个时期——那么一个时期可以倒退吗?您是否希望将其与 2019 年 6 月 12 日至 2019 年 6 月 15 日期间相同?
  • 对于特殊的边缘情况,如空间隔等。另见我的post

标签: java if-statement time boolean localdate


【解决方案1】:

理解这一点的最简单方法是考虑以下 4 种可能性:

  1. 第二个区间包含第一个区间:s2
  2. 第二个区间包含第一个区间的开始:s2
  3. 第二个区间包含第一个区间的结束:s1
  4. 第二个区间包含在第一个区间中:s1

可以表示如下:

        1.                  2.                    3.               4.

|---------------|       |-------|                |------|        |----|     Second Interval
     |-----|                 |------|        |-------|       |-----------|  First Interval
s2   s1    e1   e2      s2   s1 e2  e1      s1  s2   e1 e2   s1  s2  e2  e1

所有这四种情况的共同不变性是第二个间隔必须在第一个间隔结束之前开始,第二个间隔必须在第一个间隔开始之后结束。

这给了你:

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 <= end1start2 <= end2。如果情况并非总是如此,您还必须检查一下,如果需要,在检查上述条件之前将 startN 与 endN 交换。

【讨论】:

  • 一个问题,我认为还有更多的边缘情况?那一行就解决了问题?
  • @JoeyYue 请看我的编辑
【解决方案2】:

确定两个日期期间是否仅在逻辑下重叠就足够了。

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多