日期时间工具类

import lombok.extern.slf4j.Slf4j;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.time.temporal.TemporalQuery;
import java.util.regex.Pattern;

/**
 * 日期时间工具类
 *
 * @author 
 */
@Slf4j
public final class DateTimeValidator {

    /**
     * 6 位纯数字年月,如 202608
     */
    private static final Pattern YYYYMM = Pattern.compile("^\\d{6}$");

    /**
     * 8 位纯数字日期,如 20260821
     */
    private static final Pattern YYYYMMDD = Pattern.compile("^\\d{8}$");

    /**
     * 14 位纯数字日期时间,如 20260821125959
     */
    private static final Pattern YYYYMMDDHHMMSS = Pattern.compile("^\\d{14}$");

    /**
     * 严格模式解析 yyyyMM,uuuu 在 STRICT 下不依赖纪元
     */
    private static final DateTimeFormatter YYYYMM_FORMATTER =
            DateTimeFormatter.ofPattern("uuuuMM").withResolverStyle(ResolverStyle.STRICT);

    /**
     * 严格模式解析 yyyyMMdd,uuuu 在 STRICT 下不依赖纪元
     */
    private static final DateTimeFormatter YYYYMMDD_FORMATTER =
            DateTimeFormatter.ofPattern("uuuuMMdd").withResolverStyle(ResolverStyle.STRICT);

    /**
     * 严格模式解析 yyyyMMddHHmmss,uuuu 在 STRICT 下不依赖纪元
     */
    private static final DateTimeFormatter YYYYMMDDHHMMSS_FORMATTER =
            DateTimeFormatter.ofPattern("uuuuMMddHHmmss").withResolverStyle(ResolverStyle.STRICT);

    private DateTimeValidator() {
    }

    /**
     * 校验字符串是否为合法的 yyyyMM 格式年月(如 202608)
     * <p>
     * 仅 6 位纯数字且月份在 01-12 才返回 true,
     * 例如 202613、2026-8 均返回 false。
     *
     * @param yearMonth 待校验字符串
     * @return true-合法,false-非法
     */
    public static boolean isValidYearMonth(String yearMonth) {
        return matchesAndParses(yearMonth, YYYYMM, YYYYMM_FORMATTER, YearMonth::from);
    }

    /**
     * 校验字符串是否为合法的 yyyyMMdd 格式日期(如 20260821)
     * <p>
     * 仅 8 位纯数字且为真实存在的日期才返回 true,
     * 例如 20261301、20260230 均返回 false。
     *
     * @param date 待校验字符串
     * @return true-合法,false-非法
     */
    public static boolean isValidDate(String date) {
        return matchesAndParses(date, YYYYMMDD, YYYYMMDD_FORMATTER, LocalDate::from);
    }

    /**
     * 校验字符串是否为合法的 yyyyMMddHHmmss 格式日期时间(如 20260821125959)
     * <p>
     * 仅 14 位纯数字且为真实存在的时间才返回 true,
     * 例如 20260828245959(小时非法)、20260230125959(2月30日不存在)均返回 false。
     *
     * @param dateTime 待校验字符串
     * @return true-合法,false-非法
     */
    public static boolean isValidDateTime(String dateTime) {
        return matchesAndParses(dateTime, YYYYMMDDHHMMSS, YYYYMMDDHHMMSS_FORMATTER, LocalDateTime::from);
    }

    /**
     * 先用正则约束格式,再严格解析校验真实性
     */
    private static boolean matchesAndParses(String text, Pattern pattern, DateTimeFormatter formatter, TemporalQuery<?> query) {
        if (text == null || !pattern.matcher(text).matches()) {
            return false;
        }
        try {
            formatter.parse(text, query);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        log.info("isValidDate(\"20260828\")  = {}, 期望 true", DateTimeValidator.isValidDate("20260828"));
        log.info("isValidDate(\"20261301\")  = {}, 期望 false (月份非法)", DateTimeValidator.isValidDate("20261301"));
        log.info("isValidDate(\"20260230\")  = {}, 期望 false (2月30日不存在)", DateTimeValidator.isValidDate("20260230"));
        log.info("isValidDate(\"2026-8-21\") = {}, 期望 false (含分隔符)", DateTimeValidator.isValidDate("2026-8-21"));
        log.info("isValidDate(null)         = {}, 期望 false", DateTimeValidator.isValidDate(null));
        log.info("isValidYearMonth(\"202608\")    = {}, 期望 true", DateTimeValidator.isValidYearMonth("202608"));
        log.info("isValidYearMonth(\"202613\")    = {}, 期望 false (月份非法)", DateTimeValidator.isValidYearMonth("202613"));
        log.info("isValidYearMonth(\"2026-8\")    = {}, 期望 false (含分隔符)", DateTimeValidator.isValidYearMonth("2026-8"));
        log.info("isValidYearMonth(null)        = {}, 期望 false", DateTimeValidator.isValidYearMonth(null));
        log.info("isValidDateTime(\"20260821125959\")   = {}, 期望 true", DateTimeValidator.isValidDateTime("20260821125959"));
        log.info("isValidDateTime(\"20260821246060\")   = {}, 期望 false (时分秒非法)", DateTimeValidator.isValidDateTime("20260821246060"));
        log.info("isValidDateTime(\"20260230125959\")   = {}, 期望 false (2月30日不存在)", DateTimeValidator.isValidDateTime("20260230125959"));
        log.info("isValidDateTime(\"2026-08-21 12:59:59\") = {}, 期望 false (含分隔符)", DateTimeValidator.isValidDateTime("2026-08-21 12:59:59"));
        log.info("isValidDateTime(null)                = {}, 期望 false", DateTimeValidator.isValidDateTime(null));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值