【问题标题】:java.time.format.DateTimeParseException: Text '13/11/2020' could not be parsed at index 2java.time.format.DateTimeParseException:无法在索引 2 处解析文本“13/11/2020”
【发布时间】:2021-11-03 09:08:26
【问题描述】:

我在从字符串转换为 LocalDateTime 并将当前月份添加 3 个月时遇到问题。

这是我的代码:

String str = "13/11/2020";
LocalDateTime dateTime = LocalDateTime.parse(str, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
dateTime.plusMonths(3);      //  => output: 13/02/2021
System.out.println(dateTime);

但是当我运行它时,我得到了以下异常:

java.time.format.DateTimeParseException: Text '13/11/2020' could not be parsed at index 2
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[?:1.8.0_144]
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) ~[?:1.8.0_144]
at java.time.LocalDateTime.parse(LocalDateTime.java:492) ~[?:1.8.0_144]

我该如何解决这个问题?非常感谢

【问题讨论】:

  • 您正在使用模式dd-MM-yyyy 来解析模式dd/MM/yyyyStringdd/MM/uuuu... 相应地调整DateTimeFormatter.ofPattern(...) 中的模式。索引 2 在您的 String 中是 -,在您的模式中是 /
  • 您的模式与您的输入不匹配。你为什么期望这会奏效?你觉得"dd-MM-yyyy" 是干什么用的?
  • 是的,那么,我如何使用 13-11-2020 格式进行解析?
  • “解析”表示阅读。这并不意味着转换。如果要转换,需要先用“dd/MM/yyyy”解析,然后用“dd-MM-yyyy”格式化。

标签: java datetime java-8 localdate


【解决方案1】:

多个问题:

  1. 您的字符串看起来像LocalDateLocalDateTime,它不包含时间部分
  2. 您使用的模式与您的字符串格式不同,它应该是dd/MM/yyyydd/MM/uuuu 而不是dd-MM-yyyy

要解析你需要的字符串:

LocalDate date = LocalDate.parse(str, DateTimeFormatter.ofPattern("dd/MM/uuuu"));
dateTime = dateTime.plusMonths(3);

或者如果你想要LocalDateTime,那么你可以使用DateTimeFormatterBuilder和0来表示小时、分钟和秒:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("dd/MM/uuuu")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .toFormatter();
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
dateTime = dateTime.plusMonths(3);

结果会是这样的:2021-02-13T00:00

注意:dateTime.plusMonths(3)immutable,因此要更改值,您必须将新值分配给变量。

【讨论】:

    【解决方案2】:

    您的代码中有几个问题:

    1. 您使用了错误的格式模式。如果日期字符串包含斜杠,那么模式字符串也应该包含:DateTimeFormatter.ofPattern("dd/MM/yyyy")

    2. 如果日期不包括时间,则使用LocalDate 而不是LocalDateTime

    3. plusMonths 结果需要分配给一个新变量来获取更新后的实例。

    4. 打印预期结果13/02/2021时需要使用DateTimeFormatter,这样就可以共享同一个formatter实例:

      String str = "13/11/2020";
      var dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
      var dateTime = LocalDate.parse(str, dateTimeFormatter);
      var newDateTime = dateTime.plusMonths(3); // => output: 13/02/2021
      System.out.println(newDateTime.format(dateTimeFormatter));
      

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多