You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中不使用正则与Calendar实现含闰年判断的日期校验

Java 实现带闰年判断的日期合法性校验(禁用正则、Calendar类)

实现前提约束

  • 全程不使用正则表达式完成格式、内容校验逻辑
  • 不调用Calendar类及相关衍生API
  • 代码按职责拆分模块,公共逻辑统一收敛,合法日期基准数据独立存储

代码结构设计

  • 主组件:承载日期校验全流程核心逻辑
  • utility工具组件:存放所有公共复用方法,避免重复代码,保证结构规范
  • 本地环境存储:独立存放各年份对应的合法日期基准数据,校验时优先读取该数据源做匹配

具体实现代码

工具类(utility组件)

package your.package.utility;

public class DateCommonUtils {
    // 闰年判断规则:能被4整除但不能被100整除,或直接能被400整除
    public static boolean isLeap(int year) {
        return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    }

    // 获取指定年月的最大合法天数
    public static int countMonthMaxDay(int year, int month) {
        if (month < 1 || month > 12) return -1;
        int[] monthDays = {31,28,31,30,31,30,31,31,30,31,30,31};
        int res = monthDays[month - 1];
        // 闰年2月天数加1
        if (month == 2 && isLeap(year)) res +=1;
        return res;
    }

    // 非正则方式拆分解析MM/dd/yyyy格式的日期字符串
    public static int[] parseDateWithoutRegex(String dateStr) {
        String[] dateSeg = dateStr.split("/", 3);
        if (dateSeg.length != 3) return null;
        try {
            int month = Integer.parseInt(dateSeg[0].trim());
            int day = Integer.parseInt(dateSeg[1].trim());
            int year = Integer.parseInt(dateSeg[2].trim());
            return new int[]{month, day, year};
        } catch (NumberFormatException e) {
            return null;
        }
    }
}

主组件核心校验逻辑

package your.package.component;

import your.package.utility.DateCommonUtils;
import java.util.Map;

public class DateValidChecker {
    // 从LOCAL ENVIRONMENT加载的年月-最大天数映射表
    private Map<String, Integer> localYearMonthDayConfig;
    private static final int ERR_CODE_INVALID_DATE = 10005;

    public void loadLocalConfig(Map<String, Integer> config) {
        this.localYearMonthDayConfig = config;
    }

    public boolean check(String inputDate) {
        // 解析日期分段
        int[] dateParts = DateCommonUtils.parseDateWithoutRegex(inputDate);
        if (dateParts == null) {
            throw new IllegalArgumentException(String.valueOf(ERR_CODE_INVALID_DATE));
        }
        int month = dateParts[0], day = dateParts[1], year = dateParts[2];

        // 基础范围校验
        if (year < 1 || month <1 || month >12 || day <1) {
            throw new IllegalArgumentException(String.valueOf(ERR_CODE_INVALID_DATE));
        }

        // 优先匹配本地存储的合法数据
        String configKey = year + "-" + month;
        if (localYearMonthDayConfig.containsKey(configKey)) {
            if (day > localYearMonthDayConfig.get(configKey)) {
                throw new IllegalArgumentException(String.valueOf(ERR_CODE_INVALID_DATE));
            }
            return true;
        }

        // 本地无对应配置时,走内置闰年规则计算校验
        int maxDay = DateCommonUtils.countMonthMaxDay(year, month);
        if (day > maxDay) {
            throw new IllegalArgumentException(String.valueOf(ERR_CODE_INVALID_DATE));
        }
        return true;
    }
}

校验效果

  • 输入02/29/2012:2012为闰年,2月合法天数包含29,校验正常通过,符合MM/dd/yyyy的格式顺序要求
  • 输入02/30/2012:2月不存在30日,校验失败,抛出错误码10005

内容的提问来源于stack exchange,提问作者Carlos fernando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:20:03