You need to enable JavaScript to run this app. Java中校验yyyy-MM与yyyy-MM-dd格式日期有效性、非未来性及年月一致性
优惠活动
大模型
产品
解决方案
定价
更多

Java中校验yyyy-MM与yyyy-MM-dd格式日期有效性、非未来性及年月一致性

问题根因说明

仅修改SimpleDateFormat的格式串为yyyy-MM后校验失效,核心原因有三点:

  • 原有代码混用了SimpleDateFormat和java.time.LocalDate两套独立的日期解析体系,修改SimpleDateFormat的配置不会影响后续LocalDate.parse()的执行逻辑。LocalDate强制要求解析的字符串必须精确到日维度,传入仅含年月的字符串会直接抛出解析异常,根本无法走到后续的日期判断环节
  • 原有代码存在变量名不匹配的bug:方法入参是dateToVerify,但SimpleDateFormat实际解析的是未定义的dateAVerifier变量,解析逻辑根本没有对准要校验的目标字符串
  • 老的SimpleDateFormat解析逻辑和新API的解析逻辑重复冗余,很容易出现格式配置不一致的问题
正确实现方案

针对需要实现的三个校验目标:yyyy-MM格式合法性校验、日期不晚于当前时间、跨格式的年月一致性校验,统一基于Java 8+的java.time包实现即可,不需要再混用老的SimpleDateFormat,示例代码如下:

import java.time.YearMonth;
import java.time.LocalDate;
import java.time.format.DateTimeParseException;
import java.time.format.DateTimeFormatter;

/**
 * 校验yyyy-MM格式的日期字符串
 * @param dateToVerify 待校验的yyyy-MM格式字符串
 */
public static void isValidYearMonth(String dateToVerify) {
    try {
        // 严格按yyyy-MM格式解析,无宽松匹配逻辑
        YearMonth parsedMonth = YearMonth.parse(dateToVerify);
        // 获取当前系统时间对应的年月
        YearMonth currentMonth = YearMonth.now();
        // 校验是否晚于当前年月
        if (parsedMonth.isAfter(currentMonth)) {
            System.out.println("校验的年月晚于当前时间");
            return;
        }
        System.out.println("日期格式合法,且不晚于当前时间");
    } catch (DateTimeParseException e) {
        System.out.println("传入的yyyy-MM格式日期不合法");
    }
}

/**
 * 校验两个不同格式日期的年月是否一致
 * @param ymStr yyyy-MM格式的字符串
 * @param dayStr yyyy-MM-dddd格式的字符串
 * @return 年月是否一致
 */
public static boolean isYearMonthMatch(String ymStr, String dayStr) {
    try {
        YearMonth ym1 = YearMonth.parse(ymStr);
        // 针对自定义的yyyy-MM-dddd格式,初始化对应的格式化器
        DateTimeFormatter customFormat = DateTimeFormatter.ofPattern("yyyy-MM-dddd");
        // 从精确到天的日期字符串中提取年月维度
        YearMonth ym2 = YearMonth.from(LocalDate.parse(dayStr, customFormat));
        return ym1.equals(ym2);
    } catch (DateTimeParseException e) {
        System.out.println("存在格式不合法的日期字符串");
        return false;
    }
}

实现注意点:

  • 针对仅含年月的日期校验,不要使用LocalDate做解析,因为LocalDate必须依赖日维度的信息才能完成实例化,天然不支持只到年月的场景;YearMonth是专门对应年月维度的日期类,自带格式合法性校验,遇到月份超出1-12、格式不对的字符串会直接抛异常,不需要额外做手写校验
  • 校验是否晚于当前时间时,直接对比YearMonth维度的值即可,不需要硬拼当月1号等日期值做对比
  • 跨格式的年月一致性校验,不需要手动拆分字符串截取年、月字段对比,统一把两种格式的字符串解析成同维度的YearMonth对象后直接对比即可,能避免截取字符串时的格式错位问题

内容的提问来源于stack exchange,提问作者Saff.gh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 02:06:05