java如何判斷時(shí)間段是否交叉重疊
1.需求
要求保存每一條數(shù)據(jù)的startTime、endTime的中間時(shí)間段是唯一的,跟其他數(shù)據(jù)時(shí)間段不能存在沖突
比如:
(2019-03-01 -> 2019-03-03 ) (2019-03-02 -> 2019-03-04 )
這兩個(gè)時(shí)間段存在重疊部分
2.思路
首先,校驗(yàn)前端傳的list自身先比較是否有時(shí)間沖突;
然后,校驗(yàn)前端List跟數(shù)據(jù)庫(kù)存在的list是否有時(shí)間沖突;
方法:兩次for循環(huán)list實(shí)現(xiàn)
3.代碼部分
*實(shí)體類(lèi)*
/** * @Param: * @Description: 實(shí)體類(lèi) * @Author: zyf 2019/3/29 */ class TimeModel { private Long jobId; //主鍵 private Date startTime;//開(kāi)始時(shí)間 private Date endTime; //結(jié)束時(shí)間 //getter/setter }
*前端顯示日期格式*
public static final String DATE_FORMAT_Y_M_DHM = "yyyy-MM-dd HH:mm"; //比較日期計(jì)算到分鐘,當(dāng)然數(shù)據(jù)庫(kù)里面存的數(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ù)校驗(yàn)(自身)
/** * @Param: * @Description: list自身查詢有無(wú)時(shí)間沖突, * 優(yōu)化1: 如果自身的list過(guò)大, j遍歷不能從0開(kāi)始,只需要往后面數(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方法, 因?yàn)間etTime()的時(shí)間不太準(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ù)庫(kù)存在數(shù)據(jù)list比較
/** * @Param: listNew 前端傳的list * @Param: listOld 數(shù)據(jù)庫(kù)list, * 優(yōu)化2*****后端查詢數(shù)據(jù)庫(kù)可以根據(jù)前端的list里面最大時(shí)間和最小時(shí)間區(qū)間作為條件查詢出來(lái) * @Description: 比較前端傳的list跟數(shù)據(jù)庫(kù)list有無(wú)時(shí)間沖突 * @Author: zyf 2019/3/29 */ public static String checkTwoList(List<TimeModel> listNew, List<TimeModel> listOld) { String res = null; //沒(méi)有沖突返回null,有沖突返回沖突的時(shí)間段 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; // 前臺(tái)如果是舊數(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; }
測(cè)試
//測(cè)試 @Test public void test01() { /* * 這里模擬一下數(shù)據(jù)庫(kù)存儲(chǔ)的時(shí)間格式,精確到秒,實(shí)際情況直接進(jìn)行比較的是Date類(lèi)型 * 注意:時(shí)間點(diǎn)不能相等 * */ //model1 的開(kāi)始-結(jié)束時(shí)間 2019-03-01 14:51:00 2019-03-05 14:52:00 //model2 的開(kāi)始-結(jié)束時(shí)間 2019-03-05 14:53:00 2019-03-05 14:54:00 //model3 的開(kāi)始-結(jié)束時(shí)間 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("沖突的時(shí)間段:" + res); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12關(guān)于Spring Boot獲取bean的3種方式
這篇文章主要介紹了關(guān)于Spring Boot獲取bean的3種方式,在spring中ApplicationContext這個(gè)上下文對(duì)象是獲取bean的基礎(chǔ),需要的朋友可以參考下2023-04-04基于mybatis-plus-generator實(shí)現(xiàn)代碼自動(dòng)生成器
這篇文章專(zhuān)門(mén)為小白準(zhǔn)備了入門(mén)級(jí)mybatis-plus-generator代碼自動(dòng)生成器,可以提高開(kāi)發(fā)效率。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05Java使用Apache POI庫(kù)讀取Excel表格文檔的示例
POI庫(kù)是Apache提供的用于在Windows下讀寫(xiě)各類(lèi)微軟Office文檔的Java庫(kù),這里我們就來(lái)看一下Java使用Apache POI庫(kù)讀取Excel表格文檔的示例:2016-06-06基于Java編寫(xiě)簡(jiǎn)單的Excel工具類(lèi)
這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)簡(jiǎn)單的Excel工具類(lèi),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-02-02簡(jiǎn)單了解如何在spring中使用RabbitMQ
這篇文章主要介紹了簡(jiǎn)單了解如何在spring中使用RabbitMQ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12java實(shí)現(xiàn)二叉樹(shù)遍歷的三種方式
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)二叉樹(shù)遍歷的三種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01springboot中請(qǐng)求地址轉(zhuǎn)發(fā)的兩種方案
在開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要將請(qǐng)求從一個(gè)服務(wù)轉(zhuǎn)發(fā)到另一個(gè)服務(wù),以實(shí)現(xiàn)不同服務(wù)之間的協(xié)作,本文主要介紹了springboot中請(qǐng)求地址轉(zhuǎn)發(fā)的兩種方案,感興趣的可以了解一下2023-11-11