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转Stringpublic 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;}

测试

   //测试
    @Testpublic 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);}

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

Java校验时间段重叠相关推荐

  1. Java 最优雅方式校验时间段重叠

    文章目录 1. 时间段重叠校验问题 2. 解决方案 1. 时间段重叠校验问题 项目开发过程中经常碰到需要校验一连串时间段是否有重叠的问题,通常直观的解决方式是采用两层循环,从头至尾依次将集合中的时间段 ...

  2. java判断邮箱名和文件名_Java公开课|想学好Java,教你操作Java校验文件名和邮箱地址,快来看看...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  3. java校验集装箱柜号是否正确

    java校验集装箱柜号是否正确 开门见山地说在某些需求中是要校验集装箱的柜号,而如果了解集装箱柜号的朋友会发现,集装箱柜号的校验你可能读都读不明白,怎么去写校验.各位,莫慌,接下来我将给大家介绍集装箱 ...

  4. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  5. Java校验框架-Oval

    Java校验框架-Oval 介绍 例子 代码 pom.xml Student.java ClassInfo.java TypeCheck.java StudentVerifyTest.java 运行测 ...

  6. Java 校验时间格式是否为 yyyy-MM-dd HH:mm:ss

    微信公众号:[一起学习大数据呀] 关注可学习更多奇怪的知识! 前言 产品让我添加一个导入Excel 表格并对时间格式校验:"yyyy-MM-dd HH:mm:ss".网上的博客又参 ...

  7. java校验日期格式

    java校验日期格式 (这里提供两种校验日期格式的方法) 二.使用步骤 1.引入库 校验日期格式是否正确 代码如下(示例): public static boolean checkDate(Strin ...

  8. Java校验入参之正则表达式校验特殊字符

    Java校验入参之正则表达式校验特殊字符 前言 实现流程 总结 参考链接 前言 场景描述 第三方调用接口时,有些特殊字符不允许传参,可能影响存储.或者加解密等问题,下面以斜杠"/" ...

  9. java校验身份证号实例

    这是笔者整理的比较详细的java后端校验身份证号码的测试demo,希望对你有用,哈哈哈~ 不多说,直接上代码,喜欢的多多评论点赞,哈哈哈~ package com.lg.handlers;import ...

最新文章

  1. Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?
  2. Ubuntu 安装 Docker
  3. Java xml 工具 JDOM 使用详解.
  4. 【jQuery】复选框的全选、反选,推断哪些复选框被选中
  5. 【数据结构与算法】之深入解析“回文数”的求解思路和算法示例
  6. python常用代码_Python常用算法学习(4) 数据结构(原理+代码)-最全总结
  7. lnmp化境开启pathinfo,支持tp5.0等访问
  8. JDBC-01-快速入门
  9. 云上的Growth hacking之路,打造产品的增长引擎
  10. laravel5.6 邮件队列database驱动简单demo
  11. HarmonyOS DevEco Studio 配置本地模拟器
  12. Atitit 发送post http 功能总结目录1. 常见三种模式 Form-data Form-urlencode Raw 12. Php code 12.1. urlencode
  13. HTML特殊字符转义
  14. 中文语料 自动分词、标注词性 工具
  15. elementui日历组件实现可标记日历
  16. 基于HTML、CSS、JavaScript、jQuery的app小项目--简易备忘录
  17. 图像运动模糊及其去除
  18. U盘中毒数据丢失如何快速恢复
  19. xp网络发现不了自己的计算机,xp系统“网络发现”功能启用不了的方案介绍
  20. 3万亿背后 阿里正在造全球通用计算机

热门文章

  1. python如何将两个list合并成字典_怎么把两个列表合并成字典 论Python怎样将两个list合并为一个字典...
  2. C++ 对文件的最常用基操之对 ASCII 文件(文本文件、字符文件)的操作
  3. win7系统下联想thinkpad x220笔记本电脑关闭触摸板
  4. 【思维】黄金圈思维法则
  5. excle报盘之导入报盘
  6. 小强ERP:旅游行业的996,还能改变吗?
  7. Android自定义view之围棋动画,真牛皮
  8. Linux常用命令——pstack命令
  9. maven添加sqljdbc4.jar,并引用
  10. 【1011】甲流疫情死亡率