判断两个时间段范围是否有交集

前言

项目中经常会遇到判断两个时间段范围是否有交集,所以本文就记录下当时思考的过程和示例代码。

本文提供两种思路。

一、正向思维,求交集

以某个时间段为固定参考范围,然后有交集的情况共有以下四种情况分别对应图中的四种情况:

1)参考时间段 包含 比较时间段
2)参考时间段 只包含 比较时间段结束时间
3)参考时间段 只包含 比较时间段开始时间
4)比较时间段 包含 参考时间段

在这里插入图片描述
根据图示编写的代码示例:

/**
 * 判断两个时间范围是否有交集
 *
 * @param dynaStartTime  比较时间段开始时间
 * @param dynaEndTime    比较时间段结束时间
 * @param fixedStartTime 参考时间段开始时间
 * @param fixedEndTime   参考时间段结束时间
 * @return
 */
public static Boolean checkTimesHasOverlap(Date dynaStartTime, Date dynaEndTime, Date fixedStartTime, Date fixedEndTime) {
    if(dynaStartTime.getTime() >= fixedStartTime.getTime() && dynaEndTime.getTime() <= fixedEndTime.getTime()){
        // 参考时间段 包含 比较时间段
        return true;
    } else if (dynaStartTime.getTime() <= fixedStartTime.getTime() && (dynaEndTime.getTime() >= fixedStartTime.getTime() && dynaEndTime.getTime() <= fixedEndTime.getTime())) {
        // 参考时间段 只包含 比较时间段结束时间
        return true;
    } else if (dynaStartTime.getTime() >= fixedStartTime.getTime() && dynaStartTime.getTime() <= fixedEndTime.getTime() && fixedEndTime.getTime() >= fixedEndTime.getTime()) {
        // 参考时间段 只包含 比较时间段开始时间
        return true;
    } else if (dynaStartTime.getTime() <= fixedStartTime.getTime() &&  fixedEndTime.getTime() >= fixedEndTime.getTime()) {
        // 比较时间段 包含 参考时间段
        return true;
    }else {
        return false;
    }
}

这种方式是最直接、直观的方式,如果需要求出交集时间段,也可使用这种方式。

如果只需要判断是否有交集,其实代码可以优化合并一下的,具体示例:

/**
 * 判断两个时间范围是否有交集
 *
 * @param dynaStartTime  比较时间段开始时间
 * @param dynaEndTime    比较时间段结束时间
 * @param fixedStartTime 参考时间段开始时间
 * @param fixedEndTime   参考时间段结束时间
 * @return
 */
public static Boolean checkTimesHasOverlap(Date dynaStartTime, Date dynaEndTime, Date fixedStartTime, Date fixedEndTime) {
    if (dynaStartTime.getTime() <= fixedStartTime.getTime() && dynaEndTime.getTime() > fixedStartTime.getTime()) {
        return true;
    } else if (dynaStartTime.getTime() >= fixedStartTime.getTime() && dynaStartTime.getTime() < fixedEndTime.getTime()) {
        return true;
    }  else {
        return false;
    }
}

这样代码就比较简单了,但是理解可能相对吃力。

二、逆向思维,取反

首先求出两时间段没有交集的两种情况和图示对应,然后取反:

1) 比较时间段的结束时间在参考时间段的开始时间之前

2) 比较时间段的开始时间在参考时间段的结束时间之后
在这里插入图片描述
示例代码:

/**
 * 判断两个时间范围是否有交集
 *
 * @param dynaStartTime  比较时间段开始时间
 * @param dynaEndTime    比较时间段结束时间
 * @param fixedStartTime 参考时间段开始时间
 * @param fixedEndTime   参考时间段结束时间
 * @return
 */
public static Boolean checkTimesHasOverlap(Date dynaStartTime, Date dynaEndTime, Date fixedStartTime, Date fixedEndTime) {
    return !(dynaEndTime.getTime() < fixedStartTime.getTime() || dynaStartTime.getTime() > fixedEndTime.getTime());
}

这样代码即简单又很好理解。

————————————————
转载:判断两个时间段范围是否有交集

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值