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), 但又有时候什么都不提示,工程报错,情况有肯多中,不知道大家遇到过几种诡异的. ...
随机推荐
- 【JZOJ6353】给(ca)
description analysis 很妙的\(DP\) 设\(f[i][j]\)表示已经放了\(i\)个叶子节点.根到当前节点走了\(j\)步向左的方案数 考虑调整\(DP\)方式,钦定伸出左儿 ...
- lxhgww的奇思妙想 长链剖分板子
https://vijos.org/d/Bashu_OIers/p/5a79a3e1d3d8a103be7e2b81 求k级祖先,预处理nlogn,查询o1 //#pragma GCC optimiz ...
- Delphi利用Windows GDI实现文字倾斜
Delphi利用Windows GDI实现文字倾斜 摘要 Delphi利用Windows GDI实现文字倾斜 procedure TForm1.FormPaint(Sender: TObject);v ...
- vue cli2.x配置多环境打包
一.安装 npm install --save-dev cross-env 二.配置步骤 1.修改config下的文件 //test.env.js 'use strict' module.export ...
- 段错误 “段错误(segment fault)”、“非法操作,该内存地址不能read/write” 非法指针解引用造成的错误。
[root@test after_fc_distributed]# ./ffmpeg-linux64-v3.3.1 -i "concat:mymp3tmp/test_0.mp3|mymp3t ...
- 深刻理解Vue中的组件
转载:https://segmentfault.com/a/1190000010527064 --20更新: Vue2.6已经更新了关于内容插槽和作用域插槽的API和用法,为了不误导大家,我把插槽的内 ...
- HUD1686-Oulipo-kmp模板题/哈希模板题
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- StringUtils工具
ppublic class StringUtils { private StringUtils() { } /** * 文本左边补零 * * @param maxLength 文本长度 * @para ...
- JavaScript特效源码(1、文字特效)
注:本文以及以下关于Javascript特效源码都是分享自JavaScript源码大全. 1.逐隐逐现的的特效 逐隐逐现的文字特效[推荐使用][适用于IE4++] (修改显示的文字后根据说明进行共2步 ...
- Python全栈开发:web框架们
Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 ...