Java校验时间段重叠
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校验时间段重叠的更多相关文章
- 身份证校验,前台js校验,后台java校验
js校验: var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内 ...
- 身份证号正则校验(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 ...
- java校验时间格式 HH:MM
package com; import java.text.SimpleDateFormat; import java.util.Date; /** * @author Gerrard */ publ ...
- java校验字符串是否为json格式
觉得挺好玩的一个问题,如何校验字符串是否为标准的json格式,刚开始的回答是jsonObject或者jsonArray转换一下,如果可以转换,说明为json字符串,如果不能就抛出异常,捕获异常. 但是 ...
- Java校验8位字符串是否为正确的日期格式
import java.text.ParseException; import java.text.SimpleDateFormat; /** * 校验8位字符串是否为正确的日期格式 * @autho ...
- java校验身份证号码
/** * 18位身份证校验,粗略的校验 * @author lyl * @param idCard * @return */ public static boolean is18ByteIdCard ...
- java校验银行卡号
public class CheckBankCard { /* 校验过程: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如 ...
- java获取时间段内的所有日期
public static void main(String[] args) { SimpleDateFormat dateFormat = new SimpleDateForm ...
- java校验maven下载的jar文件
有时候maven真的很坑! 有时候提示invalid LOC header (bad signat signature), 但又有时候什么都不提示,工程报错,情况有肯多中,不知道大家遇到过几种诡异的. ...
随机推荐
- Java 基础 - 装箱, 拆箱
总结 1-装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的.(xxx代表对应的基本数据类型).例如:在装箱的时候自动调用的是Integer的 ...
- 廖雪峰Java16函数式编程-2Stream-5filter
1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过 ...
- Hibernate与数据库交互方式和Hibernate常用的几个方法
第一种,适合sql语言水平比较高的人用 HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分 ...
- 1003CSP-S模拟测试赛后总结
我是垃圾……我只会骗分. 拿到题目通读一遍,感觉T3(暴力)是个树剖+线段树. 刚学了树刨我这个兴奋啊.然而手懒决定最后再说. 对着T1一顿yyxjb码了个60pts的测试点分治就失去梦想了.(顺便围 ...
- 爬虫-Requests 使用入门
requests 的底层实现其实就是 urllib json在线解析工具 ---------------------------------------------- Linux alias命令用于设 ...
- 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 ...
- https://www.cnblogs.com/chinabin1993/p/9848720.html
转载:https://www.cnblogs.com/chinabin1993/p/9848720.html 这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感 ...
- 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 ...
- JS数组 了解成员数量(数组属性length) myarr.length
了解成员数量(数组属性length) 如果我们想知道数组的大小,只需引用数组的一个属性length.Length属性表示数组的长度,即数组中元素的个数. 语法: myarray.length; //获 ...
- Codeforces Parking Lot
http://codeforces.com/problemset/problem/630/I 简单的排列组合,推式子技巧:举一个小样例,看着推,别抽象着推,容易错 #include <iostr ...