• 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);
    
        }
  • 相关阅读:
    vue 鼠标移入移出事件执行多次(尤其ie)
    jquery input file 多图上传,单张删除,查看
    pc端vue 滚动到底部翻页
    element-ui默认样式修改
    element-ui上传一张图片后隐藏上传按钮
    echarts字体适配
    SQLServer之查询当前服务器下所有目录视图表
    SQLServer之服务器连接
    React学习之路之创建项目
    SQLServer之列数据转换为行数据
  • 原文地址:https://www.cnblogs.com/coloz/p/10626504.html
Copyright © 2020-2023  润新知