DateTimeFormatter设置STRICT模式后解析合法LocalDate仍抛异常问题
问题原因
你遇到的报错是ResolverStyle.STRICT严格解析模式和模式字符yyyy的语义不匹配导致的:
- 模式字符
y对应的是纪年年份(YEAR_OF_ERA),这个字段必须和ERA(纪年,公元/公元前)字段搭配才能确定唯一的公历年份,单独存在语义不完整 - 你使用的
yyyyMMdd模式仅包含纪年年份、月份、日期三个字段,缺少ERA字段,严格模式下解析器不会自动补全缺失的必填字段,因此哪怕是合法日期也会抛出解析异常
解决方案
方案1(推荐):将yyyy替换为uuuu
u对应的是连续公历年份(PROLEPTIC_YEAR),不需要依赖ERA字段即可确定唯一年份,是严格模式下解析纯数字日期的标准写法:
DateTimeFormatter strictFormatter = DateTimeFormatter.ofPattern("uuuuMMdd") .withResolverStyle(ResolverStyle.STRICT); // 合法日期正常解析:返回2000-04-30 LocalDate.parse("20000430", strictFormatter); // 非法日期直接抛出DateTimeParseException LocalDate.parse("20000431", strictFormatter);
方案2:保留yyyy的同时补全默认ERA值
如果需要保留yyyy写法,可以通过构造器显式指定默认纪年为公元,补全缺失字段:
DateTimeFormatter strictFormatter = new DateTimeFormatterBuilder() .appendPattern("yyyyMMdd") .parseDefaulting(ChronoField.ERA, 1) // 1对应公元纪年 .toFormatter() .withResolverStyle(ResolverStyle.STRICT);
两种方案都可以实现你需要的效果:合法日期正常解析,超过当月最大天数的非法日期直接抛出异常,不会自动调整。
内容的提问来源于stack exchange,提问作者PDStat
相关产品推荐
相关产品推荐

