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

最新文章

  1. 使用dbcp : BasicDataSource
  2. Javascript:getElementsByClassName
  3. 列表视图(ListView)和ListActivity
  4. 2435: [Noi2011]道路修建
  5. Loadrunner Http接口Get/Post方法性能测试脚本解析
  6. C# 中枚举的一点研究(跳过一些net坑的研究而已)
  7. 网上都没有提到的教程:python捕获异常后,怎么输出错误文件和行号
  8. java Arrays.asList方法注意事项
  9. 【Teradata】gtwglobal查看
  10. Spring Aware接口
  11. 动手动脑——JAVA语法基础
  12. Codeforces Round #540 (Div. 3)--1118B - Tanya and Candies(easy TL!)
  13. 【POJ1958】汉诺塔+
  14. 在线电路编程 (ICP)
  15. [转]C++之多态性与虚函数
  16. 使用Git【转】
  17. 在CentOS上安装tomcat
  18. 01_StudentManager
  19. RAW编程接口
  20. orcale 之函数

热门文章

  1. Java Collection - ArrayList &amp; LinkedList
  2. mac终端主机与用户名的修改
  3. eclipse查看源码的配置
  4. python相关软件安装流程图解——虚拟机操作——复制虚拟机主机——CentOS-7-x86_64-DVD-1810
  5. 豌豆荚Redis集群方案:Codis
  6. Oracle批量更改用户下表空间
  7. LoadRunner参数化详解【转】
  8. 使用JS实现页面中动态添加文件上传输入项
  9. day09 samba、nginx服务配置
  10. memcached 技术支持