判断两段日期是否重合

分析

首先,日期段重合主要有2种场景:

  1. 日期段 包含 日期段2
  2. 日期段2 包含 日期段1

以上的话翻译一下就是,
如果 日期段2 的开始日在 日期段1 的开始日之后,则可能出现 日期段1 包含 日期段2
如果 日期段2 的开始日在 日期段1 的开始日之前,则可能出现 日期段2 包含 日期段1

那么我们假设 日期段1 的开始日、结束日分别为A、B,日期段2 的开始日、结束日分别为X、Y,以 日期段1 为基准,先列出 日期段1 开始日 <= 日期段2 开始日的情况。


日期段1 开始日 = 日期段2 开始日:

1. 日期段2 开始日 = 日期段1 开始日
A------B
XY
X--Y
X------Y
X----------Y



日期段1 开始日 < 日期段2 开始日:

2. 日期段1 开始日 < 日期段2 开始日 < 日期段1 结束日
A------B
  XY
  X--Y
  X----Y
  X-------Y

3. 日期段2 开始日 = 日期段1 结束日
A------B
       XY
       X---Y

3. 日期段2 开始日 > 日期段1 结束日
A------B
         XY
         X---Y

接下来仍然以 日期段1 为基准,列出 日期段1 开始日 > 日期段2 的情况。
(也可以改为以 日期段2 为基准,将上面分析里的A、B和X、Y交换位置即可)


日期段1 开始日 > 日期段2 开始日:

4. 日期段2 结束日 < 日期段1 开始日
X---Y
      A------B

5. 日期段2 结束日 = 日期段1 开始日
X-----Y
      A------B

6. 日期段1 开始日 > 日期段2 结束日 > 日期段1 结束日
X--------Y
      A------B

7. 日期段2 结束日 = 日期段1 结束日
X------------Y
      A------B

8. 日期段2 结束日 > 日期段1 结束日
X---------------Y
      A------B

结论

通过观察上面的分析,发现只有2个场景的段日期不重合:

  1. 第3种:日期段1 开始日 < 日期段2 开始日,且 日期段2 开始日 > 日期段1 结束日
  2. 第4种:日期段1 开始日 > 日期段2 开始日,且 日期段2 结束日 < 日期段1 开始日

那么,在这2个场景外的其他情况都判断为重复。

代码

function isDuplicateDatePeriod(currPeriod = [], otherPeriod = []) {
  const [currStartDay, currEndDay] = currPeriod;
  const [otherStartDay, otherEndDay] = otherPeriod;
  if (!currStartDay || !currEndDay || !otherStartDay || !otherEndDay) {
    // 日期不完整,认为不重复
    return false;
  }
  const currStartTime = new Date(currStartDay).getTime();
  const currEndTime = new Date(currEndDay).getTime();
  const otherStartTime = new Date(otherStartDay).getTime();
  const otherEndTime = new Date(otherEndDay).getTime();

  if (otherStartTime > currStartTime) {
    // 其他日期段开始日期大于当前日期段开始日日期,那么其他日期段开始日期小于等于当前日期段结束日则为重复
    return otherStartTime <= currEndTime;
  } else if (otherStartTime < currStartTime) {
    // 其他日期段开始日期小于当前开始日期,那么其他日期段结束日期大于等于当前日期段开始日期则为重复
    return otherEndTime >= currStartTime;
  } else {
    // 其他日期段开始日期=当前日期段开始日期,一定重复
    return true
  }
}
### 判断两个时间区间是否重叠的方法 在编程中,判断两个时间区间是否重叠是一个常见的需求。以下是基于提供的引用内容和专业知识的一种解决方案。 #### 方法概述 为了判断两个时间区间 `[startTime1, endTime1]` 和 `[startTime2, endTime2]` 是否存在重合部分,可以采用以下逻辑: 如果 `endTime1 >= startTime2 && endTime2 >= startTime1` 成立,则说明这两个时间区间有交集[^2]。这是因为只有当第一个区间的结束时间晚于第二个区间的开始时间,并且第二个区间的结束时间晚于第一个区间的开始时间时,两者才会发生重叠。 #### Java 实现代码示例 下面提供了一个简单的 Java 函数用于检测两个时间区间是否存在重叠: ```java import java.time.LocalTime; public class TimeOverlapChecker { public static boolean isOverlapping(LocalTime startTime1, LocalTime endTime1, LocalTime startTime2, LocalTime endTime2) { // 如果 end1 大于等于 start2 并且 end2 大于等于 start1,则表示有重叠 return !endTime1.isBefore(startTime2) && !endTime2.isBefore(startTime1); } public static void main(String[] args) { LocalTime startTime1 = LocalTime.parse("09:00"); LocalTime endTime1 = LocalTime.parse("11:00"); LocalTime startTime2 = LocalTime.parse("10:00"); LocalTime endTime2 = LocalTime.parse("12:00"); if (isOverlapping(startTime1, endTime1, startTime2, endTime2)) { System.out.println("The time intervals overlap."); } else { System.out.println("The time intervals do not overlap."); } } } ``` 上述代码通过比较两个时间段的最大值和最小值得到结论。这里使用了 `LocalTime` 类型来处理时间数据,确保程序能够正确解析并操作 24 小时制的时间字符串。 #### C语言实现代码示例 对于C语言的情况,也可以编写类似的函数来进行判断。假设输入的是整数形式的小时分钟组合(如HHMM),则可以用如下方法: ```c #include <stdio.h> #include <stdbool.h> bool areIntervalsOverlapping(int startTime1, int endTime1, int startTime2, int endTime2){ return !(endTime1 < startTime2 || endTime2 < startTime1); } int main(){ int startTime1 = 900; int endTime1 = 1100; int startTime2 = 1000; int endTime2 = 1200; if(areIntervalsOverlapping(startTime1,endTime1,startTime2,endTime2)){ printf("The time intervals overlap.\n"); } else{ printf("The time intervals do not overlap.\n"); } return 0; } ``` 此段代码实现了基本的功能,即检查两个由整数值代表的时间段之间是否有任何交叉点[^5]。 ### 结论 无论是哪种语言环境下的应用开发,核心算法都保持一致——只需验证两端点之间的关系即可得出结论关于两段时间段是否会相互覆盖的信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值