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转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校验时间段重叠相关推荐
- Java 最优雅方式校验时间段重叠
文章目录 1. 时间段重叠校验问题 2. 解决方案 1. 时间段重叠校验问题 项目开发过程中经常碰到需要校验一连串时间段是否有重叠的问题,通常直观的解决方式是采用两层循环,从头至尾依次将集合中的时间段 ...
- java判断邮箱名和文件名_Java公开课|想学好Java,教你操作Java校验文件名和邮箱地址,快来看看...
[摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...
- java校验集装箱柜号是否正确
java校验集装箱柜号是否正确 开门见山地说在某些需求中是要校验集装箱的柜号,而如果了解集装箱柜号的朋友会发现,集装箱柜号的校验你可能读都读不明白,怎么去写校验.各位,莫慌,接下来我将给大家介绍集装箱 ...
- 组织机构代码和统一社会信用代码校验规则以及java校验工具类
组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...
- Java校验框架-Oval
Java校验框架-Oval 介绍 例子 代码 pom.xml Student.java ClassInfo.java TypeCheck.java StudentVerifyTest.java 运行测 ...
- Java 校验时间格式是否为 yyyy-MM-dd HH:mm:ss
微信公众号:[一起学习大数据呀] 关注可学习更多奇怪的知识! 前言 产品让我添加一个导入Excel 表格并对时间格式校验:"yyyy-MM-dd HH:mm:ss".网上的博客又参 ...
- java校验日期格式
java校验日期格式 (这里提供两种校验日期格式的方法) 二.使用步骤 1.引入库 校验日期格式是否正确 代码如下(示例): public static boolean checkDate(Strin ...
- Java校验入参之正则表达式校验特殊字符
Java校验入参之正则表达式校验特殊字符 前言 实现流程 总结 参考链接 前言 场景描述 第三方调用接口时,有些特殊字符不允许传参,可能影响存储.或者加解密等问题,下面以斜杠"/" ...
- java校验身份证号实例
这是笔者整理的比较详细的java后端校验身份证号码的测试demo,希望对你有用,哈哈哈~ 不多说,直接上代码,喜欢的多多评论点赞,哈哈哈~ package com.lg.handlers;import ...
最新文章
- Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?
- Ubuntu 安装 Docker
- Java xml 工具 JDOM 使用详解.
- 【jQuery】复选框的全选、反选,推断哪些复选框被选中
- 【数据结构与算法】之深入解析“回文数”的求解思路和算法示例
- python常用代码_Python常用算法学习(4) 数据结构(原理+代码)-最全总结
- lnmp化境开启pathinfo,支持tp5.0等访问
- JDBC-01-快速入门
- 云上的Growth hacking之路,打造产品的增长引擎
- laravel5.6 邮件队列database驱动简单demo
- HarmonyOS DevEco Studio 配置本地模拟器
- Atitit 发送post http 功能总结目录1. 常见三种模式 Form-data Form-urlencode Raw 12. Php code 12.1. urlencode
- HTML特殊字符转义
- 中文语料 自动分词、标注词性 工具
- elementui日历组件实现可标记日历
- 基于HTML、CSS、JavaScript、jQuery的app小项目--简易备忘录
- 图像运动模糊及其去除
- U盘中毒数据丢失如何快速恢复
- xp网络发现不了自己的计算机,xp系统“网络发现”功能启用不了的方案介绍
- 3万亿背后 阿里正在造全球通用计算机
热门文章
- python如何将两个list合并成字典_怎么把两个列表合并成字典 论Python怎样将两个list合并为一个字典...
- C++ 对文件的最常用基操之对 ASCII 文件(文本文件、字符文件)的操作
- win7系统下联想thinkpad x220笔记本电脑关闭触摸板
- 【思维】黄金圈思维法则
- excle报盘之导入报盘
- 小强ERP:旅游行业的996,还能改变吗?
- Android自定义view之围棋动画,真牛皮
- Linux常用命令——pstack命令
- maven添加sqljdbc4.jar,并引用
- 【1011】甲流疫情死亡率