我想在 "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 个月,所以现在我们得到了预期的异常。
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 在 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 个月,所以现在我们得到了预期的异常。