Java校驗時間段重疊


1.需求

 要求保存每一條數據的startTimeendTime的中間時間段是唯一的,跟其他數據時間段不能存在沖突

比如: (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)

                || (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和數據庫存在數據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)
   || (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() {

        /*
        * 這里模擬一下數據庫存儲的時間格式,精確到秒,實際情況直接進行比較的是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);

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM