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

I want to parse string as date using DateTimeFormatter with in "MMdd" but it is even parsing string like "3212" which is wrong

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

为了获得您期望的错误消息,您需要解析为适当类型的日期时间对象。您的代码仅解析字符串,而不是试图解释它。所以没有发现没有第32个月。尝试例如:

    dateTimeFormatter.parse("3212", MonthDay::from);

这产生:

Exception in thread "main" java.time.format.DateTimeParseException: Text '3212' could not be parsed: Unable to obtain MonthDay from TemporalAccessor: {MonthOfYear=32, DayOfMonth=12},ISO of type java.time.format.Parsed

为什么会这样? Java 认为您的格式化程序独立于特定的日历系统或年表。您可以检查 dateTimeFormatter.getChronology() returns null。正如 Arnaud Denoyelle 在 中指出的那样,您将 returns 称为 TemporalAccessor 的单参数 DateTimeFormatter.parse 方法。 TemporalAccessor 的文档说:

implementations of this interface may be in calendar systems other than ISO.

一些日历系统有 13 个月(在某些年份)。与其对月份数量设置任意限制(13?14?15?),不如决定将其留给您通常用于保存数据的具体日期和时间 classes。我使用的 MonthDay class 表示“ISO-8601 日历系统中的月-日”,其中一年总是有 12 个月,所以现在我们得到了预期的异常。