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

发布时间:2020-10-21 16:08:51

来源:脚本之家

阅读:108

作者:SakuyaM

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

思路很简单:定义一个时间段的概念,既然是时间段就包含起始时间和终止时间这两个时间点。构造方法要保证起始时间在终止时间之前,这样才是一个有效的时间段概念。

为TimeSlot这个类定义四个比较先后顺序的方法,分别为:小于、大于、小于等于、大于等于。画张简单的时间线图理解一下就明白了。当整个时间段作为一个整体时,只有时间段小于或大于另一个时间段时,它们才没有重叠的交集。

代码如下,有什么错误还请各位看官帮忙指出

package com.abc.common.util;

import lombok.Data;

import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**

* 日期工具类

*

* 使用LocalDateTime存取或判断

*

* @see java.time.LocalDateTime

* @date 2020-6-29 10:20:42

*/

@Component

public class DateUtil {

/**

* 判断两个时间段是否重叠

* @param slot1

* @param slot2

* @return

*/

public static boolean overlapped(TimeSlot slot1, TimeSlot slot2) {

TimeSlot previous, next;

previous = slot1.startTime.isBefore(slot2.startTime) ? slot1 : slot2;

next = slot2.startTime.isAfter(slot1.startTime) ? slot2 : slot1;

// 这里业务需要,允许时间点的重叠

// 例如某个时间段的起始时间:2020-06-29 00:00:00

// 和另一个时间段的终止时间:2020-06-29 00:00:00

// 它们俩可以有交点。如果不需要这种逻辑只把le改成lt

// ,ge改成gt就可

return !(le(previous, next) || ge(previous, next));

}

/**

* 构造一个时间段

* @param startTime

* @param endTime

* @return

*/

public static TimeSlot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {

return new TimeSlot(startTime, endTime);

}

/**

* less equal

* 小于等于

* @param prev

* @param next

* @return

*/

private static boolean le(TimeSlot prev, TimeSlot next) {

return lt(prev, next) || next.endTime.isEqual(prev.startTime);

}

/**

* greater equal

* 大于等于

* @param prev

* @param next

* @return

*/

private static boolean ge(TimeSlot prev, TimeSlot next) {

return gt(prev, next) || prev.endTime.isEqual(next.startTime);

}

/**

* greater than

* 大于

* @param prev

* @param next

* @return

*/

private static boolean gt(TimeSlot prev, TimeSlot next) {

return prev.endTime.isBefore(next.startTime);

}

/**

* less than

* 小于

* @param prev

* @param next

* @return

*/

private static boolean lt(TimeSlot prev, TimeSlot next) {

return next.endTime.isBefore(prev.startTime);

}

/**

* 时间段类

*/

@Data

static class TimeSlot{

private LocalDateTime startTime;

private LocalDateTime endTime;

public TimeSlot(LocalDateTime startTime, LocalDateTime endTime) {

if (startTime.isAfter(endTime)) {

this.startTime = endTime;

this.endTime = startTime;

} else {

this.startTime = startTime;

this.endTime = endTime;

}

}

}

}

在业务代码中调用:

// ...

if (DateUtil.overlapped(

DateUtil.buildSlot(beginTime, endTime),

DateUtil.buildSlot(beginTime1, endTime1)

)) {

// 时间段有重叠,写下重叠情况的业务代码

}

// ...

当然也可以把TimeSlot这个类拎出来,那样或许更方便。

补充知识:Java计算Date类时间差的函数

我就废话不多说了,大家还是直接看代码吧~

public static String TimeDifference(long start, long end) {

long between = end - start;

long day = between / (24 * 60 * 60 * 1000);

long hour = (between / (60 * 60 * 1000) - day * 24);

long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);

long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);

long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000

- min * 60 * 1000 - s * 1000);

String timeDifference = day + "天" + hour + "小时" + min + "分" + s + "秒" + ms

+ "毫秒";

return timeDifference;

}

以上这篇java 判断两个时间段是否重叠的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持亿速云。

java 时间段重叠_java 判断两个时间段是否重叠的案例相关推荐

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

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

  2. java 时间段重叠_Java判断多个时间段是否重叠(重叠区间个数)

    import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 判断多个时间段是否出现重叠 ...

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

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

  4. java 时间戳间隔_JAVA判断两个时间戳,相隔多少分钟

    展开全部 10位的时间戳,相减除以60,得到的就62616964757a686964616fe4b893e5b19e31333365646363是相隔多少分钟: 13位的时间戳,相减除以60000,得 ...

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

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

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

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

  7. java判断list相等_java 判断两个list是否相等

    /** * 队列比较 * @param * @param a * @param b * @return */ public static > boolean compare(List a, Li ...

  8. java比较两个list是否相同_Java判断两个List是否相同

    1.利用Java中为List提供的方法retainAll() /** * 判断两个List内的元素是否相同 * * 此方法有bug 见Food.class * * @param list1 * @pa ...

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

    前言 项目中经常会遇到判断两个时间段范围是否有交集,所以本文就记录下当时思考的过程和示例代码. 本文提供两种思路. 一.正向思维,求交集 以某个时间段为固定参考范围,然后有交集的情况共有以下四种情况分 ...

最新文章

  1. Fashion MNIST自编码器网络实战
  2. 程序员裸辞求夸,众网友上演大型夸夸秀现场:楼主好样的
  3. CentOs Linux 文件位置标记
  4. Intel VT学习笔记(七)—— EPT物理地址转换
  5. 说说TDD的好处和坏处-对话
  6. mysql表的视图怎么建立_MySQL如何创建视图
  7. java动态网站框架_大型网站动态应用系统架构
  8. java数组求和递归,js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值...
  9. c++ why can't class template hide its implementation in cpp file?
  10. 车模型一般多少钱_婚车租赁一般多少钱?最新婚车出租价格表!
  11. mysql数据库服务器实例_服务器上运行一个mysql实例里有多个数据库呢?还是多MYSQL实例?...
  12. 你还在烦U盘记录该如何消除吗
  13. arcgis api for js实现克里金插值渲染图--不依赖GP服务
  14. 搜狗微信文章采集php,[造轮子]爬取搜狗微信公众号文章
  15. sin1用计算机怎么算,sin1等于多少?
  16. PHP中Linux知识,超全面的Linux基础知识整理
  17. 在postfix使用qq企业邮箱的smtp
  18. 巧用order实现列表排序
  19. C语言算三角形外心坐标,【c语言】三角形外心坐标
  20. 魅族pro7plus android10,魅族PRO7和PRO7 Plus有什么区别?哪个好?一文秒懂

热门文章

  1. 禁用VScode ESlint
  2. 接触分析在电子连接器设计中的应用:二 接触力变化曲线、应力变化曲线获取及端子变形仿真
  3. 页面动态显示服务器,动态服务器页面应用
  4. 傲游浏览器能改字体吗 网页字体设置方法简述
  5. 2021秋季学期总结
  6. 计算机网络常见协议,常见的网络协议书范本.doc
  7. android悬浮 按钮列表,Android悬浮菜单按钮FloatingActionButton实现
  8. 计算机手机模型,手机、平板电脑等电子设备的E3D模型包AE模板,含29个
  9. QDialog对话框右上角的问号按钮如何取消
  10. 2017年薪资满意度白皮书:五年内月薪不过万太慢!