如何在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
相关产品推荐
相关产品推荐

