无法解析String到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 ,我希望这可行。 但是,我收到了一条非常友好和乐于助人的消息:
引起:java.time.DateTimeException:无法从TemporalAccessor获取LocalDate:{DayOfMonth = 1,MonthOfYear = 7,WeekBasedYear [WeekFields [MONDAY,4]] = 2015},ISO类型为java.time.format.Parsed
我真的不明白这个例外告诉我的是什么。 任何人都可以解释我出了什么问题吗?
对于一年,你必须使用小写y:
final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy");
大写Y用于周年。 有关更多详细信息,请参阅DateTimeFormatter的javadoc 。
这个问题的答案是使用’y’而不是’Y’。
要解释错误消息,让我们分解它:
Unable to obtain LocalDate from TemporalAccessor
这就是说它无法从TemporalAccessor
(提供对日期/时间字段的类似hashmap的访问的低级接口)创建LocalDate
(请求的内容)。
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()
forms。 据说解析了四件事:
-
DayOfMonth=1
,解析为值为1
-
MonthOfYear=7
,解析值为7
的月份 -
WeekBasedYear[WeekFields[MONDAY,4]]=2015
,基于周的年份,其值为2015
-
ISO
,ISO日历系统(默认值)
由于无法从DayOfMonth + MonthOfYear + WeekBasedYear组合生成LocalDate
,因此会抛出exception。
请注意, [WeekFields[MONDAY,4]]
部分指的是,在周日开始的美国周,有许多不同的方式来定义一周,但在ISO标准和欧盟,他们从星期一开始。