无法将String解析为LocalDate(Java 8)

mth*_*ers 26 java datetime java-8 java-time

我的输入是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);
Run Code Online (Sandbox Code Playgroud)

基于DateTimeFormatterJavaDoc,我希望这可行.但是,我收到了一条非常友好和乐于助人的消息:

引起:java.time.DateTimeException:无法从TemporalAccessor获取LocalDate:{DayOfMonth = 1,MonthOfYear = 7,WeekBasedYear [WeekFields [MONDAY,4]] = 2015},ISO类型为java.time.format.Parsed

我真的不明白这个异常告诉我的是什么.任何人都可以解释我出了什么问题吗?

Jen*_*ens 36

对于一年,你必须使用小写y:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy");
Run Code Online (Sandbox Code Playgroud)

大写Y用于周年.有关更多详细信息,请参阅DateTimeFormatterjavadoc.

  • 错误消息显示{DayOfMonth = 1,MonthOfYear = 7,WeekBasedYear [WeekFields [MONDAY,4]] = 2015},这意味着它从您的输入字符串解析为DayOfMonth(因为您在模式中使用了"d"),7是被解析为MonthOfYear(因为你的模式中有"M")而2015年被理解为WeekBasedYear(又名weekyear)因为你的模式中有"Y" (4认同)
  • 出于好奇,错误信息如何与"Y"用于_weekyear_而"y"用于_year_这一事实有关? (3认同)

Jod*_*hen 18

这个问题的答案是使用'y'而不是'Y'.

要解释错误消息,让我们分解它:

Unable to obtain LocalDate from TemporalAccessor

这就是说它无法LocalDateTemporalAccessor(提供类似hashmap的访问日期/时间字段的低级接口)创建(请求的内容).

of type java.time.format.Parsed

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

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

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

  • DayOfMonth=1,每月解析的值为 1
  • MonthOfYear=7,每月的解析值为 7
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015,以周为基础的年份解析了价值 2015
  • ISO,这是ISO日历系统(默认值)

由于无法LocalDate从DayOfMonth + MonthOfYear + WeekBasedYear组合生成a ,因此抛出异常.

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