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

2022-09-01 09:30:01

我的输入是 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},JAVA.time.format.Parsed 类型的 ISO

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


答案 1

对于年份,您必须使用小写字母 y:

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

大写字母 Y 用于表示周年。有关更多详细信息,请参阅 DateTimeFormatter 的 javadoc


答案 2

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

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

Unable to obtain LocalDate from TemporalAccessor

这是说它不能从(提供对日期/时间字段的类似哈希映射的访问的低级接口)创建(请求的内容)。LocalDateTemporalAccessor

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 组合生成 a,因此会引发异常。LocalDate

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