1.需求

要求保存每一条数据的startTime、endTime的中间时间段是唯一的,跟其他数据时间段不能存在冲突

比如: (2019-03-01 -> 2019-03-03 )  (2019-03-02 -> 2019-03-04 )  这两个时间段存在重叠部分

2.思路

首先,校验前端传的list<model>自身先比较是否有时间冲突;

然后,校验前端List跟数据库存在的list是否有时间冲突;

方法: 两次for循环list实现

2.代码部分

实体类 

  1. /**
  2. * @Param:
  3. * @Description: 实体类
  4. * @Author: zyf 2019/3/29
  5. */
  6. class TimeModel {
  7. private Long jobId; //主键
  8. private Date startTime;//开始时间
  9. private Date endTime; //结束时间
  10. //getter/setter
  11. }

  前端显示日期格式

  1. public static final String DATE_FORMAT_Y_M_DHM = "yyyy-MM-dd HH:mm"; //比较日期计算到分钟,当然数据库里面存的数据一般精确到秒
  1. // date转String
  2. public static String dateToStr(Date date) {
  3. String strDate = "";
  4. SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_Y_M_DHM);
  5. strDate = sdf.format(date);
  6. return strDate;
  7. }

  1. 前端List数据校验(自身)
  1. /**
  2. * @Param:
  3. * @Description: list自身查询有无时间冲突,
  4. * 优化1: 如果自身的list过大, j遍历不能从0开始,只需要往后面数据比较大小
  5. * @Author: zyf 2019/3/29
  6. */
  7. public static String checkSelf(List<TimeModel> list) {
  8. String res = null;
  9. if (list.size() == 0) {
  10. return res;
  11. }
  12. for (int i = 0; i < list.size(); i++) {
  13. // long I_S = list.get(i).getEffectiveStartTime().getTime();
  14. // long I_E = list.get(i).getEffectiveEndTime().getTime();
  15. Date I_S = list.get(i).getStartTime();
  16. Date I_E = list.get(i).getEndTime();
  17. // for (int j = 0; j < list.size(); j++) {
  18. for (int j = i+1; j < list.size(); j++) {
  19. /* if (i == j) {
  20. continue; //自身不跟自身比较
  21. }*/
  22. Date J_S = list.get(j).getStartTime();
  23. Date J_E = list.get(j).getEndTime();
  24. //这里使用compareTo方法, 因为getTime()的时间不太准确
  25. if ((J_S.compareTo(I_S) == -1 && I_S.compareTo(J_E) == -1)
  26. || (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)   //新加部分

  1. || J_E.compareTo(I_S) == 0 || J_S.compareTo(I_E) == 0
  2. || J_E.compareTo(I_E) == 0 || J_S.compareTo(I_S) == 0) {
  3. res = dateToStr(list.get(i).getStartTime()) + " "
  4. + dateToStr(list.get(i).getEndTime());
  5. break;
  6. }
  7. }
  8. }
  9. return res;
  10. }

前端list和数据库存在数据list比较

  1. /**
  2. * @Param: listNew 前端传的list
  3. * @Param: listOld 数据库list,
  4. * 优化2*****后端查询数据库可以根据前端的list里面最大时间最小时间区间作为条件查询出来
  5. * @Description: 比较前端传的list跟数据库list有无时间冲突
  6. * @Author: zyf 2019/3/29
  7. */
  8. public static String checkTwoList(List<TimeModel> listNew, List<TimeModel> listOld) {
  9. String res = null; //没有冲突返回null,有冲突返回冲突的时间段
  10. for (int i = 0; i < listNew.size(); i++) {
  11. Date I_S = listNew.get(i).getStartTime();
  12. Date I_E = listNew.get(i).getEndTime();
  13. Long jobIdNew = listNew.get(i).getJobId();
  14. for (int j = 0; j < listOld.size(); j++) {
  15. Long jobIdOld = listOld.get(j).getJobId();
  16. Date J_S = listOld.get(j).getStartTime();
  17. Date J_E = listOld.get(j).getEndTime();
  18.  
  19. if (jobIdNew != null && jobIdNew.longValue() == jobIdOld.longValue()) {
  20. continue; // 前台如果是旧数据修改不能再跟自己比较
  21. }
  22. //compareTo返回结果-1 0 1 表示前者比后者<,=,>关系 ,下面的if判断涉及具体的怎样比较可以自行优化
  23. if ((J_S.compareTo(I_S) == -1 && I_S.compareTo(J_E) == -1)
  24. || (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)   //新加部分
  25. || J_E.compareTo(I_S) == 0 || J_S.compareTo(I_E) == 0
  26. || J_E.compareTo(I_E) == 0 || J_S.compareTo(I_S) == 0) {
  27. res = dateToStr(listNew.get(i).getStartTime()) + " "
  28. + dateToStr(listNew.get(i).getEndTime());
  29. break;
  30. }
  31. }
  32. }
  33. return res;
  34. }

测试

  1. //测试
  2. @Test
  3. public void test01() {
  4.  
  5. /*
  6. * 这里模拟一下数据库存储的时间格式,精确到秒,实际情况直接进行比较的是Date类型
  7. * 注意:时间点不能相等
  8. * */
  9. //model1 的开始-结束时间 2019-03-01 14:51:00 2019-03-05 14:52:00
  10. //model2 的开始-结束时间 2019-03-05 14:53:00 2019-03-05 14:54:00
  11. //model3 的开始-结束时间 2019-03-02 14:53:00 2019-03-05 14:53:00
  12.  
  13. List<TimeModel> list = new ArrayList<>();
  14. List<TimeModel> listOld = new ArrayList<>();
  15. TimeModel mode1 = new TimeModel();
  16. mode1.setStartTime(strToDate("2019-03-01 14:51:00"));
  17. mode1.setEndTime(strToDate("2019-03-05 14:52:00"));
  18.  
  19. TimeModel mode2 = new TimeModel();
  20. //mode2.setStartTime(strToDate("2019-03-05 14:51:00")); //checkSelf()使用
  21. mode2.setStartTime(strToDate("2019-03-05 14:53:00")); //checkTwoList()使用
  22. mode2.setEndTime(strToDate("2019-03-05 14:54:00"));
  23.  
  24. TimeModel mode3 = new TimeModel();
  25. mode3.setStartTime(strToDate("2019-03-02 14:53:00"));
  26. mode3.setEndTime(strToDate("2019-03-05 14:58:00"));
  27.  
  28. list.add(mode1);
  29. list.add(mode2);
  30.  
  31. //String res = checkSelf(list); //checkSelf()使用
  32.  
  33. listOld.add(mode3); //checkTwoList()使用
  34. String res = checkTwoList(list,listOld);
  35. System.out.println("冲突的时间段:" + res);
  36.  
  37. }

Java校验时间段重叠的更多相关文章

  1. 身份证校验,前台js校验,后台java校验

    js校验: var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内 ...

  2. 身份证号正则校验(js校验+JAVA校验)

    js校验身份证号[15位和18位] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...

  3. java校验时间格式 HH:MM

    package com; import java.text.SimpleDateFormat; import java.util.Date; /** * @author Gerrard */ publ ...

  4. java校验字符串是否为json格式

    觉得挺好玩的一个问题,如何校验字符串是否为标准的json格式,刚开始的回答是jsonObject或者jsonArray转换一下,如果可以转换,说明为json字符串,如果不能就抛出异常,捕获异常. 但是 ...

  5. Java校验8位字符串是否为正确的日期格式

    import java.text.ParseException; import java.text.SimpleDateFormat; /** * 校验8位字符串是否为正确的日期格式 * @autho ...

  6. java校验身份证号码

    /** * 18位身份证校验,粗略的校验 * @author lyl * @param idCard * @return */ public static boolean is18ByteIdCard ...

  7. java校验银行卡号

    public class CheckBankCard { /* 校验过程: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如 ...

  8. java获取时间段内的所有日期

        public static void main(String[] args) {        SimpleDateFormat dateFormat = new SimpleDateForm ...

  9. java校验maven下载的jar文件

    有时候maven真的很坑! 有时候提示invalid LOC header (bad signat signature), 但又有时候什么都不提示,工程报错,情况有肯多中,不知道大家遇到过几种诡异的. ...

随机推荐

  1. Java 基础 - 装箱, 拆箱

    总结 1-装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的.(xxx代表对应的基本数据类型).例如:在装箱的时候自动调用的是Integer的 ...

  2. 廖雪峰Java16函数式编程-2Stream-5filter

    1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过 ...

  3. Hibernate与数据库交互方式和Hibernate常用的几个方法

    第一种,适合sql语言水平比较高的人用 HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分 ...

  4. 1003CSP-S模拟测试赛后总结

    我是垃圾……我只会骗分. 拿到题目通读一遍,感觉T3(暴力)是个树剖+线段树. 刚学了树刨我这个兴奋啊.然而手懒决定最后再说. 对着T1一顿yyxjb码了个60pts的测试点分治就失去梦想了.(顺便围 ...

  5. 爬虫-Requests 使用入门

    requests 的底层实现其实就是 urllib json在线解析工具 ---------------------------------------------- Linux alias命令用于设 ...

  6. rancher v2.2.4创建kubernetes集群出现[etcd] Failed to bring up Etcd Plane: [etcd] Etcd Cluster is not healthy

    主机:rancher(172.16.2.17),master(172.16.2.95),node01(172.16.2.234),node02(172.16.2.67) 问题:开始是用的rancher ...

  7. https://www.cnblogs.com/chinabin1993/p/9848720.html

    转载:https://www.cnblogs.com/chinabin1993/p/9848720.html 这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感 ...

  8. PAT甲级——A1123 Is It a Complete AVL Tree【30】

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  9. JS数组 了解成员数量(数组属性length) myarr.length

    了解成员数量(数组属性length) 如果我们想知道数组的大小,只需引用数组的一个属性length.Length属性表示数组的长度,即数组中元素的个数. 语法: myarray.length; //获 ...

  10. Codeforces Parking Lot

    http://codeforces.com/problemset/problem/630/I 简单的排列组合,推式子技巧:举一个小样例,看着推,别抽象着推,容易错 #include <iostr ...