【问题标题】:java 8 datatime parse errorjava 8日期时间解析错误
【发布时间】:2017-09-26 23:20:06
【问题描述】:

我正在尝试将字符串转换为 LocalDate 对象。但我收到以下错误。

private LocalDate getLocalDate(String year) {
        String yearFormatted = "2015-01-11";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd");
        LocalDate dateTime = LocalDate.parse(yearFormatted, formatter);
        return  dateTime;
    }

这是错误

Caused by: java.time.format.DateTimeParseException: Text '2015-01-11' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=11, WeekBasedYear[WeekFields[SUNDAY,1]]=2015, MonthOfYear=1},ISO of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920) ~[na:1.8.0_102]
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855) ~[na:1.8.0_102]
    at java.time.LocalDate.parse(LocalDate.java:400) ~[na:1.8.0_102]

【问题讨论】:

  • 试试DateTimeFormatter.ofPattern("yyyy-MM-dd");
  • 你能解释一下为什么吗?
  • 因为LocalDate 不知道如何处理基于周的年份(格式化程序中的“Y”)。它需要一年('u')或年代('y')

标签: java-8 localdate


【解决方案1】:

正如the documentation 所说,格式模式中的大写Y 是基于周的年份,即周数所属的年份。这并不总是与日历年相同(尽管最常见的是)。 Java 足够聪明,可以识别出它不能确保从基于周的年、月和日中获取日期,因此它会抛出异常。

由于您的字符串格式与默认的LocalDate 格式(ISO 8601)一致,因此最简单的解决方案是完全删除格式化程序并执行以下操作:

    LocalDate dateTime = LocalDate.parse(yearFormatted);

通过此更改,您的方法将返回 2015-01-11 的日期,正如我认为您所期望的那样。另一个解决方法是将 YYYY 替换为小写的 yyyy 表示年份或 uuuu 表示有符号的年份(其中 0 是 1 BC,-1 是 2BC,等等)。

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 2018-05-27
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多