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)

                || (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); }

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. [JZOJ6257] 【省选模拟8.9】修路

    题目 题目大意 有一堆点,每个点都有其权值\(c_i\). 每次插入边\((u,v)\),\(u\)和\(1\)连通,\(v\)和\(1\)不连通.最后保证形成一棵树. 每次插入的时候询问\(1\)到 ...

  2. [JZOJ2679] 跨时代

    题目 题目大意 给你一堆边,你要将它们围成面积最大的矩形. 边不一定要用完,而且围成的矩形不能凸出一块. \(n\leq 16\) \(l_i \leq 15\) 思考历程 看到这题的第一眼,就会立马 ...

  3. Windows start

    启动一个单独的窗口以运行指定的程序或命令. START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]   ...

  4. csps模拟87888990部分题解

    题面:https://www.cnblogs.com/Juve/articles/11752338.html https://www.cnblogs.com/Juve/articles/1175241 ...

  5. 实时检测网络状态及是否可以连接Internet

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. x-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码

    ylbtech-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码 1.返回顶部 1. REDUCING BOILERPL ...

  7. CSS清除默认边距

    body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquo ...

  8. CSS之Important

    1.important只能用于直接选中,不能用于间接选中 2.通配符选择器选中的标签也是直接选中的 3.!important只能提升被指定的属性的优先级 ,其他属性的优先级不会被提升 4.!impor ...

  9. java_增强for循环

    增强for循环(foreach): 底层使用了迭代器,简化了迭代器的书写 JDK1.5新特性 所有的单列集合都可以使用增强for循环 for(集合/数组 的数据类型 变量名 : 集合名/数组名) pu ...

  10. AWS云管理平台