我想使用“ MMdd”中的DateTimeFormatter将字符串解析为日期,但它甚至解析“ 3212”之类的字符串,这是错误的

时间:2018-08-13 12:21:17

标签: java datetime-format string-to-datetime

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MMdd");
dateTimeFormatter.parse("3212");

1 个答案:

答案 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方法将返回TemporalAccessorTemporalAccessor的文档说:

  

此接口的实现可能在其他日历系统中   比ISO。

某些日历系统有13个月(在某些年份)。与其为月数设置一个任意的限制(13?14?15?),还不如将其保留为通常用于保存数据的具体日期和时间类。我使用的MonthDay类表示“ ISO-8601日历系统中的月日”,其中一年始终有12个月,所以现在我们得到了预期的例外。