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

