判断两个时间段或多组时间段是否重叠的算法(已测)
在网上搜索了一些大佬的算法思路和具体实现,然后结合自己本身项目的环境得出以下实现
实现思路: 轮询判断给定时间段是否与已知任意时间段存在交集
废不多说,直接上代码
package org.jeecg.modules.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class isOverlapping{
/**
* 判断给定时间段[startTime,endTime]是否与已知任意时间段存在交集
* 思路:轮询对比给定时间段,和 已知时间段的起始时间和结束时间
* @return flag = true 表示两个时间段没有重叠
*/
public static boolean isNormal(String startTime, String endTime, List<Map<String, String>> originList) {
boolean flag = true;
if (!isEmpty(startTime) && !isEmpty(endTime)) {
startTime = formatDate(startTime);
endTime = formatDate(endTime);
if (originList != null && originList.size() > 0) {
for (int i = 0; i < originList.size(); i++) {
//核心判断, 文章最后有判断思路解释
if (startTime.compareTo(originList.get(i).get("end")) <= 0 &&
endTime.compareTo(originList.get(i).get("start")) >= 0 ) {
flag = false;
break;
}
}
}
}
return flag;
}
public static boolean isEmpty(String object) {
if (object == null) {
object = "";
}
return object.length() == 0;
}
public static String formatDate(String date) {
if (date != null) {
date = date.replace("/", "").replace(":", "").replace(" ", "").replace("-", "");
} else {
date = "";
}
return date;
}
public static void main(String[] args) {
List<Map<String, String>> originList = new ArrayList<>();
String testTime1 = formatDate("2021-03-30 17:29:00");
String testTime2 = formatDate("2021-03-30 20:00:00");
Map<String, String> map1 = new HashMap<>();
map1.put("start", testTime1);
map1.put("end", testTime2);
originList.add(map1);
String testTime3 = formatDate("2021-03-29 20:00:00");
String testTime4 = formatDate("2021-03-30 00:00:00");
Map<String, String> map2 = new HashMap<>();
map2.put("start", testTime3);
map2.put("end", testTime4);
originList.add(map2);
String startTime = "2021-03-30 20:00:01";
String endTime = "2021-03-30 21:00:00";
System.err.println("时间段无交集测试结果:"+isNormal(startTime, endTime, originList));
String startTime2 = "2021-03-30 10:00:01";
String endTime2 = "2021-03-30 21:00:00";
System.err.println("时间段交集测试结果:"+isNormal(startTime2, endTime2, originList));
String startTime3 = "2021-03-29 20:00:00";
String endTime3 = "2021-03-30 00:00:00";
System.err.println("时间段相同测试结果:"+isNormal(startTime3, endTime3, originList));
}
}
测试结果展示:
顺便粘上 算法大佬的算法逻辑
判断两个时间段是否重叠,如:
startdate1 — enddate1
startdate2 — enddate2
两个时间的重叠分4种情况,若你一一列出这四种情况来判断是否重叠那就弱爆了,最简单的方法:
startdate1 <=enddate2 and enddate1>=startdate2
若你无法理解上面这种方法,那我还有下面的方法提供给你:
(startdate1 BETWEEN startdate2 AND enddate2)
or (enddate1 BETWEEN startdate2 AND enddate2)
or (startdate2 BETWEEN startdate1 AND enddate1)
or (enddate2 BETWEEN startdate1 AND enddate1)
算法逻辑转自
https://blog.csdn.net/mypcstyle/article/details/37510145
若觉得对你有帮助请帮点个赞,谢谢挽尊