java.time.format.DateTimeParseException:无法在索引3处解析文本

Uma*_*Uma 13 date-parsing java-8 java-time

我使用Java 8来解析日期并找到两个日期之间的差异.

这是我的片段:

String date1 ="01-JAN-2017";
String date2 = "02-FEB-2017";

DateTimeFormatter df = DateTimeFormatter .ofPattern("DD-MMM-YYYY", en);
LocalDate  d1 = LocalDate.parse(date1, df);
LocalDate  d2 = LocalDate.parse(date2, df);

Long datediff = ChronoUnit.DAYS.between(d1,d2);
Run Code Online (Sandbox Code Playgroud)

当我运行时,我收到错误:

java.time.format.DateTimeParseException:无法在索引3处解析文本

小智 22

首先,检查javadoc.大写D表示天的年字段(不是当天的日,只要你想),和大写Y表示基于为期一周的年字段(而不是一年,只要你想).正确的模式是小写字母dy.

此外,您使用大写字母(JANFEB)的月份名称,因此您的格式化程序必须不区分大小写(默认行为是只接受像Jan和这样的值Feb).这些月份名称是英文缩写,因此您还必须使用英语区域设置来确保它正确解析名称(使用java.util.Locale类).

因此,您的格式化程序应该像这样创建:

DateTimeFormatter df = new DateTimeFormatterBuilder()
    // case insensitive to parse JAN and FEB
    .parseCaseInsensitive()
    // add pattern
    .appendPattern("dd-MMM-yyyy")
    // create formatter (use English Locale to parse month names)
    .toFormatter(Locale.ENGLISH);
Run Code Online (Sandbox Code Playgroud)

这将使您的代码工作(datediff并将成为32).

  • 真的很棒的答案.涵盖所有相关的内容并且恰到好处. (5认同)
  • 从我的错误消息(DateTimeParseException: Text could not be parsed at index 0)来看,添加语言环境很关键并且不明显。谢谢你的提示! (2认同)

Ram*_*tta 19

以下代码有效。问题是您使用的是“JAN”而不是“Jan”。DateTimeFormatter 似乎无法识别。并将模式更改为“d-MMM-yyyy”。

  String date1 ="01-Jan-2017";
  String date2 = "02-Feb-2017";

  DateTimeFormatter df = DateTimeFormatter.ofPattern("d-MMM-yyyy");
  LocalDate  d1 = LocalDate.parse(date1, df);
  LocalDate  d2 = LocalDate.parse(date2, df);

  Long datediff = ChronoUnit.DAYS.between(d1,d2);  
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.mkyong.com/java8/java-8-how-to-convert-string-to-localdate/

  • @Uma,夏令时不会有任何问题。即使夏令时开始,比如说,3 月 26 日,从 3 月 25 日到 3 月 26 日仍然只有 1 天。当使用 `LocalDate` 时,完全忽略实际上只有 23 小时。事实上,`LocalDate` 忽略任何时区,因此完全忽略任何 DST。 (2认同)