美文网首页
java 校验日期是否与数据库日期重叠

java 校验日期是否与数据库日期重叠

作者: 洃冭鎯oo | 来源:发表于2020-03-29 15:39 被阅读0次

最近开发遇到这样一个需求:开始日期与结束日期不能重复添加,也不能添加数据库中,已存在数据的开始日期与结束日期之间的数据;如果数据库内的结束日期为null,则表示无限大,不允许在进行添加
先梳理下逻辑:
1、添加的开始日期 >= 数据库的开始日期 && 添加的开始日期 <= 数据结束日期 【false】
2、添加的结束日期 >= 数据库的开始日期 && 添加的结束日期 <= 数据库的结束日期 【false】
3、添加的开始日期 <= 数据库的开始日期 && 添加的开始日期 >= 数据库的结束日期 【false】
4、如果数据库内的结束日期为null 【false】

Java 代码 codes

package com.shenqi.mom.commons.utils;

import javafx.util.Pair;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName OverlappingPeriod
 * @Description TODO
 * @Autgor huang
 * @Date 2020-03-11 14:38
 */
@Data
public class OverlappingPeriod implements Serializable {
    private static final long serialVersionUID = 2597443893772941283L;

    /**
     * 判断给定时间段[formDate,toDate]是否与已知时间段存在交集,不存在返回true
     *
     * @param formDate   例:20200218
     * @param toDate     例:20200418
     * @param objectList 正序存储的时间段集合[{start:A0,end:A1},{start:B0,end:B1}]
     * @return
     */
    public static boolean isNormal(String formDate, String toDate, List<Pair<String, String>> objectList) {

        if (!objectList.isEmpty()) {
            for (int i = 0; i < objectList.size(); i++) {
                if (StringUtils.isBlank(objectList.get(i).getValue())) {
                    if (StringUtils.isBlank(toDate)) {
                        return false;
                    }
                    if (toDate.compareTo(objectList.get(i).getKey()) >= 0) {
                        return false;
                    }
                    continue;
                }
                if (StringUtils.isBlank(toDate)) {
                    if (formDate.compareTo(objectList.get(i).getValue()) >= 0) {
                        continue;
                    }
                    if (formDate.compareTo(objectList.get(i).getValue()) <= 0) {
                        return false;
                    }
                    return true;
                }
                if ((formDate.compareTo(objectList.get(i).getKey()) >= 0
                        && formDate.compareTo(objectList.get(i).getValue()) <= 0)
                        || (toDate.compareTo(objectList.get(i).getKey()) >= 0
                        && toDate.compareTo(objectList.get(i).getValue()) <= 0)
                        || (formDate.compareTo(objectList.get(i).getKey()) <= 0
                        && toDate.compareTo(objectList.get(i).getValue()) >= 0)) {
                    return false;
                }
            }
        }
        return true;
    }


    public static void main(String[] args) {
        List<Pair<String, String>> originList = new ArrayList<>();
        originList.add(new Pair<>("20190310", "20190318"));
        originList.add(new Pair<>("20190310", "20190318"));
        String startX = "20190318";
        String endX = "20190330";
        System.err.println("最小值之前[" + startX + "," + endX + "]:" + isNormal(startX, endX, originList));
        String startX2 = "20200301";
        String endX2 = "20200315";
        System.err.println("最大值之后[" + startX2 + "," + endX2 + "]:" + isNormal(startX2, endX2, originList));
        String startX3 = "20200101";
        String endX3 = "20200131";
        System.err.println("中间段[" + startX3 + "," + endX3 + "]:" + isNormal(startX3, endX3, originList));

        String startX4 = "20200311";
        String endX4 = "20200319";
        System.err.println("交叉段[" + startX4 + "," + endX4 + "]:" + isNormal(startX4, endX4, originList));
    }
}

Pair<String, String>是一个键值元素,和Map还是有很大区别的,K值村放的开始日期,V值存放的结束日期
当我们在进行调用的时候:
record.getFromDate(): 开始日期
record.getToDate(): 结束日期
dataList: 数据库查询处理的数据集合
结果返回true 或 false

List<Pair<String, String>> mapList = dataList.stream()
                    .map(entity -> new Pair<>(entity.getFromDate(), entity.getToDate())).collect(Collectors.toList());
            boolean flag = OverlappingPeriod.isNormal(record.getFromDate(), record.getToDate(), mapList);
            if (!flag) {
                throw new BaseException(ResponseCode.FAIL.getCode(), "生效或失效时间重叠,请更换时间再进行添加!");
            }

这样就可以进行日期校验了,小弟技术有限,欢迎大神纠错指正,谢谢!

相关文章

  • java 校验日期是否与数据库日期重叠

    最近开发遇到这样一个需求:开始日期与结束日期不能重复添加,也不能添加数据库中,已存在数据的开始日期与结束日期之间的...

  • 日期重叠

    (老旧的日子,实在没力气继续,勉强着说:不,实在没时间。) 五月十三日,颜市颜港街,瓦当上些许灯光,穿越数个朝代。...

  • java常用日期时间校验

    1.yyyyMMdd日期格式校验 ((\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[...

  • JS、JAVA、MYSQL时间日期

    --文章内容总结了包括JS、JAVA、MYSQL从前端到数据库的所有日期相关常用操作,包括日期格式化和日期计算以及...

  • Java8日期/时间API

    旧的日期/时间API的缺点 Java日期与时间类定义不一致,java.util和java.sql包都有日期类,ja...

  • java日期

    一.Date类(java.util.Date) 二.SimpleDateFormat日期格式化类 三.Calend...

  • java日期

  • Java 日期

    1.创建日期对象 打印结果 2.getTime方法 Date类型有一个 getTime() 方法得到一个long型...

  • 快速校验日期是否有效的方式-js实现

    说明 快速校验日期是否有效的方法。可能不是原创,但这是自己想出来。 具体代码

  • java日期处理

    java日期 java日期时间处理,主要是三个类Date(日期)、Calendar(日历)、DateFormat(...

网友评论

      本文标题:java 校验日期是否与数据库日期重叠

      本文链接:https://www.haomeiwen.com/subject/tsquuhtx.html