java如何判斷時間段是否交叉重疊
1.需求
要求保存每一條數(shù)據(jù)的startTime、endTime的中間時間段是唯一的,跟其他數(shù)據(jù)時間段不能存在沖突
比如:
(2019-03-01 -> 2019-03-03 ) (2019-03-02 -> 2019-03-04 )
這兩個時間段存在重疊部分
2.思路
首先,校驗前端傳的list自身先比較是否有時間沖突;
然后,校驗前端List跟數(shù)據(jù)庫存在的list是否有時間沖突;
方法:兩次for循環(huán)list實現(xiàn)
3.代碼部分
*實體類*
/**
* @Param:
* @Description: 實體類
* @Author: zyf 2019/3/29
*/
class TimeModel {
private Long jobId; //主鍵
private Date startTime;//開始時間
private Date endTime; //結(jié)束時間
//getter/setter
}
*前端顯示日期格式*
public static final String DATE_FORMAT_Y_M_DHM = "yyyy-MM-dd HH:mm"; //比較日期計算到分鐘,當(dāng)然數(shù)據(jù)庫里面存的數(shù)據(jù)一般精確到秒
// date轉(zhuǎn)String
public static String dateToStr(Date date) {
String strDate = "";
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_Y_M_DHM);
strDate = sdf.format(date);
return strDate;
}
前端List數(shù)據(jù)校驗(自身)
/**
* @Param:
* @Description: list自身查詢有無時間沖突,
* 優(yōu)化1: 如果自身的list過大, j遍歷不能從0開始,只需要往后面數(shù)據(jù)比較大小
* @Author: zyf 2019/3/29
*/
public static String checkSelf(List<TimeModel> list) {
String res = null;
if (list.size() == 0) {
return res;
}
for (int i = 0; i < list.size(); i++) {
// long I_S = list.get(i).getEffectiveStartTime().getTime();
// long I_E = list.get(i).getEffectiveEndTime().getTime();
Date I_S = list.get(i).getStartTime();
Date I_E = list.get(i).getEndTime();
// for (int j = 0; j < list.size(); j++) {
for (int j = i+1; j < list.size(); j++) {
/* if (i == j) {
continue; //自身不跟自身比較
}*/
Date J_S = list.get(j).getStartTime();
Date J_E = list.get(j).getEndTime();
//這里使用compareTo方法, 因為getTime()的時間不太準(zhǔn)確
if ((J_S.compareTo(I_S) == -1 && I_S.compareTo(J_E) == -1)
|| (J_S.compareTo(I_E) == -1 && I_E.compareTo(J_E) == -1)
|| (I_S.compareTo(J_S) == -1 && J_S.compareTo(I_E) == -1) //新加部分
|| (I_S.compareTo(J_E) == -1 && J_E.compareTo(I_E) == -1) //新加部分
|| J_E.compareTo(I_S) == 0 || J_S.compareTo(I_E) == 0
|| J_E.compareTo(I_E) == 0 || J_S.compareTo(I_S) == 0) {
res = dateToStr(list.get(i).getStartTime()) + " "
+ dateToStr(list.get(i).getEndTime());
break;
}
}
}
return res;
}
前端list和數(shù)據(jù)庫存在數(shù)據(jù)list比較
/**
* @Param: listNew 前端傳的list
* @Param: listOld 數(shù)據(jù)庫list,
* 優(yōu)化2*****后端查詢數(shù)據(jù)庫可以根據(jù)前端的list里面最大時間和最小時間區(qū)間作為條件查詢出來
* @Description: 比較前端傳的list跟數(shù)據(jù)庫list有無時間沖突
* @Author: zyf 2019/3/29
*/
public static String checkTwoList(List<TimeModel> listNew, List<TimeModel> listOld) {
String res = null; //沒有沖突返回null,有沖突返回沖突的時間段
for (int i = 0; i < listNew.size(); i++) {
Date I_S = listNew.get(i).getStartTime();
Date I_E = listNew.get(i).getEndTime();
Long jobIdNew = listNew.get(i).getJobId();
for (int j = 0; j < listOld.size(); j++) {
Long jobIdOld = listOld.get(j).getJobId();
Date J_S = listOld.get(j).getStartTime();
Date J_E = listOld.get(j).getEndTime();
if (jobIdNew != null && jobIdNew.longValue() == jobIdOld.longValue()) {
continue; // 前臺如果是舊數(shù)據(jù)修改不能再跟自己比較
}
//compareTo返回結(jié)果-1 0 1 表示前者比后者<,=,>關(guān)系 ,下面的if判斷涉及具體的怎樣比較可以自行優(yōu)化
if ((J_S.compareTo(I_S) == -1 && I_S.compareTo(J_E) == -1)
|| (J_S.compareTo(I_E) == -1 && I_E.compareTo(J_E) == -1) || (I_S.compareTo(J_S) == -1 && J_S.compareTo(I_E) == -1) //新加部分 || (I_S.compareTo(J_E) == -1 && J_E.compareTo(I_E) == -1) //新加部分
|| J_E.compareTo(I_S) == 0 || J_S.compareTo(I_E) == 0
|| J_E.compareTo(I_E) == 0 || J_S.compareTo(I_S) == 0) {
res = dateToStr(listNew.get(i).getStartTime()) + " "
+ dateToStr(listNew.get(i).getEndTime());
break;
}
}
}
return res;
}測試
//測試
@Test
public void test01() {
/*
* 這里模擬一下數(shù)據(jù)庫存儲的時間格式,精確到秒,實際情況直接進行比較的是Date類型
* 注意:時間點不能相等
* */
//model1 的開始-結(jié)束時間 2019-03-01 14:51:00 2019-03-05 14:52:00
//model2 的開始-結(jié)束時間 2019-03-05 14:53:00 2019-03-05 14:54:00
//model3 的開始-結(jié)束時間 2019-03-02 14:53:00 2019-03-05 14:53:00
List<TimeModel> list = new ArrayList<>();
List<TimeModel> listOld = new ArrayList<>();
TimeModel mode1 = new TimeModel();
mode1.setStartTime(strToDate("2019-03-01 14:51:00"));
mode1.setEndTime(strToDate("2019-03-05 14:52:00"));
TimeModel mode2 = new TimeModel();
//mode2.setStartTime(strToDate("2019-03-05 14:51:00")); //checkSelf()使用
mode2.setStartTime(strToDate("2019-03-05 14:53:00")); //checkTwoList()使用
mode2.setEndTime(strToDate("2019-03-05 14:54:00"));
TimeModel mode3 = new TimeModel();
mode3.setStartTime(strToDate("2019-03-02 14:53:00"));
mode3.setEndTime(strToDate("2019-03-05 14:58:00"));
list.add(mode1);
list.add(mode2);
//String res = checkSelf(list); //checkSelf()使用
listOld.add(mode3); //checkTwoList()使用
String res = checkTwoList(list,listOld);
System.out.println("沖突的時間段:" + res);
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何解決SpringBoot2.x版本對Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
關(guān)于Spring Boot獲取bean的3種方式
這篇文章主要介紹了關(guān)于Spring Boot獲取bean的3種方式,在spring中ApplicationContext這個上下文對象是獲取bean的基礎(chǔ),需要的朋友可以參考下2023-04-04
基于mybatis-plus-generator實現(xiàn)代碼自動生成器
這篇文章專門為小白準(zhǔn)備了入門級mybatis-plus-generator代碼自動生成器,可以提高開發(fā)效率。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05
Java使用Apache POI庫讀取Excel表格文檔的示例
POI庫是Apache提供的用于在Windows下讀寫各類微軟Office文檔的Java庫,這里我們就來看一下Java使用Apache POI庫讀取Excel表格文檔的示例:2016-06-06
springboot中請求地址轉(zhuǎn)發(fā)的兩種方案
在開發(fā)過程中,我們經(jīng)常需要將請求從一個服務(wù)轉(zhuǎn)發(fā)到另一個服務(wù),以實現(xiàn)不同服務(wù)之間的協(xié)作,本文主要介紹了springboot中請求地址轉(zhuǎn)發(fā)的兩種方案,感興趣的可以了解一下2023-11-11

