代码之家  ›  专栏  ›  技术社区  ›  mthmulders

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

  •  32
  • mthmulders  · 技术社区  · 9 年前

    我的输入是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

    我真的不明白这个例外告诉我什么。有人能告诉我出了什么问题吗?

    2 回复  |  直到 9 年前
        1
  •  42
  •   Jens    9 年前

    今年你必须使用小写的y:

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

    大写Y用于工作年度。请参见 javadoc of DateTimeFormatter 了解更多详情。

        2
  •  23
  •   JodaStephen    9 年前

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

    要解释错误消息,请将其分解:

    Unable to obtain LocalDate from TemporalAccessor

    这意味着它无法创建 LocalDate (请求的内容)来自 TemporalAccessor (提供对日期/时间字段的哈希图式访问的低级接口)。

    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组合中,抛出异常。

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