无法将字符串解析为 LocalDate (Java 8)

Can't parse String to LocalDate (Java 8)

我的输入是 2015 年 7 月 1 日格式为“01-07-2015”的日期的字符串表示。我正在尝试将其解析为 java.time.LocalDate 变量:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-YYYY");
final String input = "01-07-2015";
final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT);

基于 DateTimeFormatter JavaDoc,我希望它能工作。然而,我收到了一条非常友好和有用的信息:

Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO of type java.time.format.Parsed

我真的不明白这个异常告诉我什么。谁能给我解释一下出了什么问题?

年份你必须使用小写的 y:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy");

大写 Y 用于周年。有关详细信息,请参阅 javadoc of DateTimeFormatter

问题的答案是使用 'y' 而不是 'Y'。

为了解释错误信息,让我们分解它:

Unable to obtain LocalDate from TemporalAccessor

这是说它无法从 TemporalAccessor(提供对 date/time).

of type java.time.format.Parsed

这是说传入方法的对象是 java.time.format.Parsed 类型。这是解析的标准输出类型,包含已解析的所有信息。

{DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO

这是 java.time.format.Parsed 对象的 toString() 形式,由解析产生。它说解析了四件事:

  • DayOfMonth=1,用值 1
  • 解析的日期
  • MonthOfYear=7,用 7
  • 值解析的月份
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015,以 2015
  • 值解析的基于周的年份
  • ISO,也就是ISO日历系统(默认值)

由于无法根据 DayOfMonth + MonthOfYear + WeekBasedYear 的组合生成 LocalDate,因此抛出异常。

请注意,[WeekFields[MONDAY,4]] 部分是指有许多不同的方式来定义一周,在美国,周从星期日开始,但在 ISO 标准和欧盟,它们从星期一开始。