博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java校验时间段重叠
阅读量:4635 次
发布时间:2019-06-09

本文共 5482 字,大约阅读时间需要 18 分钟。

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
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
listNew, List
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
list = new ArrayList<>(); List
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); }

 

转载于:https://www.cnblogs.com/coloz/p/10626504.html

你可能感兴趣的文章
Loadrunner安装使用入门
查看>>
smartupload 上传文件时 把页面编码改成gbk 解决乱码
查看>>
EPS是什么格式
查看>>
input禁止显示历史输入记录
查看>>
Python的数据库操作(Sqlalchemy)
查看>>
2.抽取代码(BaseActivity)
查看>>
My simplified pickit2 clone
查看>>
Redis 入门知识
查看>>
夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
查看>>
转--Android如何在java代码中设置margin
查看>>
反射的所有api
查看>>
Js 判断网页窗口是否滚动到底部
查看>>
上传文件
查看>>
css 定位及遮罩层小技巧
查看>>
用java向mysql数据库中插入数据为空
查看>>
项目中非常有用并且常见的ES6语法
查看>>
dateTimePicker编辑状态下,取值不正确的问题
查看>>
mac 端口转发方案
查看>>
[2017.02.23] Java8 函数式编程
查看>>
loadrunner支持https协议的操作方法-经验总结
查看>>