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

最近开发遇到这样一个需求:开始日期与结束日期不能重复添加,也不能添加数据库中,已存在数据的开始日期与结束日期之间的数据;如果数据库内的结束日期为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(), "生效或失效时间重叠,请更换时间再进行添加!");
            }

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容