Java DateTime API日期解析问题:无效日期未返回原输入,合法日期报错
问题分析与解决方案
核心问题
- 初始代码的
DateTimeFormatter默认使用ResolverStyle.SMART,会自动调整无效日期(比如20240230会被修正为2024-02-28),不会抛出异常,无法触发catch分支返回原输入。 - 添加
ResolverStyle.STRICT后,使用yyyyMMdd模式会抛出异常,因为yyyy在严格模式下表示纪元年份(YearOfEra),需要明确的纪元标识(如AD/BC)才能解析,而输入是纯数字的公元纪年,无法匹配。
修正代码
将格式模式从yyyyMMdd改为uuuuMMdd,uuuu代表公元纪年的年份,无需纪元标识,配合ResolverStyle.STRICT可严格校验日期合法性:
String valueDate(String valueDate_yyyyMMdd) { try { DateTimeFormatter DATE_FORMATTER_YYYYMMDD = DateTimeFormatter .ofPattern("uuuuMMdd", Locale.US) .withResolverStyle(ResolverStyle.STRICT); final LocalDate valueDate = LocalDate.parse(StringUtils.trim(valueDate_yyyyMMdd), DATE_FORMATTER_YYYYMMDD); return DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.ENGLISH).format(valueDate); } catch (Exception e) { log.warn("failed to convert {} into ddMMMyyyy format", valueDate_yyyyMMdd, e); return valueDate_yyyyMMdd; } }
关键说明
uuuuvsyyyy:uuuu是ISO-8601标准的公元纪年年份,适用于无纪元标识的数字年份输入;yyyy在严格模式下需要纪元信息,因此会导致合法日期解析失败。- ResolverStyle.STRICT:严格校验日期合法性,比如20240230这种不存在的日期会直接抛出
DateTimeParseException,进入catch分支返回原输入。 - Locale设置:指定
Locale.US和Locale.ENGLISH确保日期解析和格式化不受系统默认区域影响,保证结果一致性。
内容的提问来源于stack exchange,提问作者ildvzg68472
相关产品推荐
相关产品推荐

