JodaTime解析无效日期未抛异常却自动调整结果,求技术解答
问题原因与解决方案
你遇到的这个情况,核心原因是Joda-Time默认启用了宽松解析模式——它不会严格校验所有日期字段的一致性。当你输入的星期几和指定的日期(2016年2月1日)不匹配时,宽松模式会自动调整日期来满足星期几的条件,而非抛出异常。
具体场景解析
2016年2月1日实际是星期一,但你输入的是Friday。宽松模式下,解析器会从2月1日开始向后查找最近的星期五,也就是2月5日,因此最终输出的是这个调整后的日期。
如何让解析器抛出异常
要实现你预期的“字段冲突时抛出异常”的行为,需要将解析器设置为严格模式。具体做法是在DateTimeFormatter上调用withResolverStyle(ResolverStyle.STRICT):
final DateTimeFormatter formatter = DateTimeFormat.forPattern("EEEE, d MMMM yyyy") .withResolverStyle(ResolverStyle.STRICT); // 启用严格校验模式 final DateTime date = formatter.parseDateTime("Friday, 1 February 2016"); System.out.println(formatter.print(date));
修改后运行代码,就会抛出IllegalArgumentException,提示日期字段不一致,符合你的预期。
补充:ResolverStyle的三种模式
Joda-Time提供了三种解析策略:
- LENIENT(默认):允许字段溢出、自动调整,尽可能生成有效日期
- SMART:介于宽松与严格之间,比如月份溢出时会调整年份,但星期与日期冲突时仍会调整日期
- STRICT:严格校验所有字段的一致性,任何逻辑冲突都会抛出异常
内容的提问来源于stack exchange,提问作者Robert Mark Bram
相关产品推荐
相关产品推荐

