前言

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

本文提供两种思路。

一、正向思维,求交集

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

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());
}

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

判断两个时间段范围是否有交集相关推荐

  1. 判断两个时间段交集、时间重叠问题

    判断两个时间段范围是否有交集(时间重叠)问题经常遇到,比如预约会议室开会,活动的开始结束等,本文做此分析. 前提:本文时间传参已做限制,结束时间必须大于开始时间 1.正向思维 代码如下 (oneSta ...

  2. java 时间段重叠_java 判断两个时间段是否重叠的案例

    java 判断两个时间段是否重叠的案例 发布时间:2020-10-21 16:08:51 来源:脚本之家 阅读:108 作者:SakuyaM 最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找 ...

  3. java里怎么判断时间重合_java 判断两个时间段是否重叠的案例

    最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码.大佬们的思路过于简洁了,有些理解不了.还只是个菜鸟码农,还是多锻炼锻炼自己的思路. 思路很简单:定义一个时间段的概念,既然是时间段 ...

  4. 判断两个时间段是否重叠的算法

    判断两个时间段是否重叠,如: startdate1 - enddate1 startdate2 - enddate2 两个时间的重叠分4种情况,若你一一列出这四种情况来判断是否重叠那就弱爆了,最简单的 ...

  5. 判断两个时间区间是否存在交集-Java实现

    以下demo用于判断两个时间区间是否存在交集. 代码如下: ============================================================== package ...

  6. Oracle判断两个时间段是否有重叠

    判断两个时间段是否有重叠 (a,b),(c,d) 判断两段时间是否有重叠 方法一 select 'yes' from dual where d>a  and c<b; 方法二 select ...

  7. 判断两个时间段是否相差 几 个月

    //比较两个时间 time1,time2均为日期类型 //判断两个时间段是否相差 m 个月 function completeDate(time1 , time2 , m) {var diffyear ...

  8. 如何判断两个时间段是否有交集

    给定两个左闭右开时间段 [A, B).[X, Y),如何判断它们是否有交集? 由于时间可以转换为时间戳,时间戳是一个数字,所以我们可以将问题转换为:如何判断两个左闭右开的数字区间是否有交集. 结论是如 ...

  9. mysql时间段重叠_MySQL判断两个时间段是否有重合

    两个集合不交叉,只要新插入的条记录的结束时间大于已存在的记录的开始时间并且新插入记录的最小值小于已存在记录的最大值,那么这两个时间段一定存在交叉. 总结起来就一句话:最小值小于最大值并且最大值大于最小 ...

最新文章

  1. 美国多个城市禁止、我国却蓬勃发展的人脸识别是什么样子?
  2. 5首页加载慢_5个 外贸建站谷歌SEO优化技巧
  3. 集合框架源码学习之HashMap(JDK1.8)
  4. Notepad++使用技巧
  5. (128)System Verilog下降沿检测实例
  6. 笨方法学Python3 习题6
  7. 基于自抗扰控制的高速列车自动驾驶速度控制
  8. Win10屏保设置详细教程
  9. 程序员的996简史!我们是怎么一步步陷入996工作制的
  10. Windows XP SP3 笔记本专用版 电脑疯子 2010年巨献
  11. html5 sms短信发送_使用电子邮件免费向手机发送短信(SMS)
  12. 使用JohnTheRipper对有密码加密的ZIP压缩包文件进行暴力破解
  13. python3.8安装robotfrmework-ride安装及报错完美解决方法
  14. 【moment】moment生成日历图及日历事件展示
  15. 织梦如何与mysql连接_织梦dedecms,网站怎么搬家并成功连接数据库
  16. 从事IT业一个8年老兵转行前的自我总结2——从《易经》说开来
  17. 工程流体力学笔记暂记10(动量矩方程)
  18. VisionMaster 4.0.0 的Modbus通信
  19. OMG,12 个精致的 Java 字符串操作小技巧,学它
  20. python freshman day1

热门文章

  1. 最长回文子串(C++,详细注释)
  2. 网易易盾流量多发反外挂落地实践
  3. springcloudalibaba学习分享
  4. Spark—RDD算子使用IDEA-Scala操作练习:请根据磁盘文件“数据集”data01.txt,该数据集包含了某大学计算机系的成绩,计算下列问题。
  5. Python pygame(GUI编程)模块最完整教程(1)
  6. matlab 使用定时器画连续正弦波信号
  7. markdown编辑器typora如何显示文章字数统计
  8. Cesium官方教程9--粒子系统
  9. 助你快速踏入高薪职场——2017面试集锦之数据库
  10. php源码 微信企业号,查看“微信支付”的源代码