Java校驗時間段重疊
阿新 • • 發佈:2019-03-30
com tin return amp urn pri 條件查詢 實體 list數據
1.需求
要求保存每一條數據的startTime、endTime的中間時間段是唯一的,跟其他數據時間段不能存在沖突
比如: (2019-03-01 -> 2019-03-03 ) (2019-03-02 -> 2019-03-04 ) 這兩個時間段存在重疊部分
2.思路
首先,校驗前端傳的list<model>自身先比較是否有時間沖突;
然後,校驗前端List跟數據庫存在的list是否有時間沖突;
方法: 兩次for循環list實現
2.代碼部分
實體類
/** * @Param: * @Description: 實體類 * @Author: zyf 2019/3/29*/ class TimeModel { private Long jobId; //主鍵 private Date startTime;//開始時間 private Date endTime; //結束時間 //getter/setter }
前端顯示日期格式
public static final String DATE_FORMAT_Y_M_DHM = "yyyy-MM-dd HH:mm"; //比較日期計算到分鐘,當然數據庫裏面存的數據一般精確到秒
// date轉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數據校驗(自身)
/** * @Param: * @Description: list自身查詢有無時間沖突, * 優化1: 如果自身的list過大, j遍歷不能從0開始,只需要往後面數據比較大小 * @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()的時間不太準確 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) || 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和數據庫存在數據list比較
/** * @Param: listNew 前端傳的list * @Param: listOld 數據庫list, * 優化2*****後端查詢數據庫可以根據前端的list裏面最大時間和最小時間區間作為條件查詢出來 * @Description: 比較前端傳的list跟數據庫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; // 前臺如果是舊數據修改不能再跟自己比較 } //compareTo返回結果-1 0 1 表示前者比後者<,=,>關系 ,下面的if判斷涉及具體的怎樣比較可以自行優化 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) || 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() { /* * 這裏模擬一下數據庫存儲的時間格式,精確到秒,實際情況直接進行比較的是Date類型 * 註意:時間點不能相等 * */ //model1 的開始-結束時間 2019-03-01 14:51:00 2019-03-05 14:52:00 //model2 的開始-結束時間 2019-03-05 14:53:00 2019-03-05 14:54:00 //model3 的開始-結束時間 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); }
Java校驗時間段重疊