DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MMdd");
dateTimeFormatter.parse("3212");
答案 0 :(得分:2)
为了获得您期望的错误消息,您需要解析为适当种类的datetime对象。您的代码仅分析字符串,而不尝试解释它。因此,没有发现没有第32个月。尝试例如:
dateTimeFormatter.parse("3212", MonthDay::from);
这将产生:
线程“ main”中的异常java.time.format.DateTimeParseException: 无法解析文字“ 3212”:无法从中获取MonthDay TemporalAccessor:{MonthOfYear = 32,DayOfMonth = 12},ISO类型 java.time.format.Parsed
为什么会这样? Java认为格式化程序独立于特定的日历系统或年代。您可以检查dateTimeFormatter.getChronology()
是否返回null
。正如Arnaud Denoyelle在a comment中指出的那样,您调用的单参数DateTimeFormatter.parse
方法将返回TemporalAccessor
。 TemporalAccessor
的文档说:
此接口的实现可能在其他日历系统中 比ISO。
某些日历系统有13个月(在某些年份)。与其为月数设置一个任意的限制(13?14?15?),还不如将其保留为通常用于保存数据的具体日期和时间类。我使用的MonthDay
类表示“ ISO-8601日历系统中的月日”,其中一年始终有12个月,所以现在我们得到了预期的例外。