无法将字符串解析为 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 标准和欧盟,它们从星期一开始。
我的输入是 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 标准和欧盟,它们从星期一开始。