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

时间:2015-07-24 08:13:59

标签: 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);

基于DateTimeFormatter JavaDoc,我希望这可行。但是,我收到了一条非常友好和乐于助人的信息:

  

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

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

2 个答案:

答案 0 :(得分:32)

一年你必须使用小写y:

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

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

答案 1 :(得分:17)

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

要解释错误消息,请分解它:

Unable to obtain LocalDate from TemporalAccessor

这就是说它无法从LocalDate(提供对日期/时间字段的类似hashmap的访问的低级接口)创建TemporalAccessor(请求的内容)。 / p>

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日历系统(默认值)

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

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