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

时间:2017-07-05 12:07:09

标签: java-8 java-time date-parsing

我使用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);

当我跑步时,我得到错误:

  

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

5 个答案:

答案 0 :(得分:19)

首先,check the javadoc。大写D代表日期字段(不是日期),大写Y代表以年为基础的年度字段(不是年份)。正确的模式是小写字母dy

此外,您使用大写字母(JANFEB)的月份名称,因此您的格式化程序必须不区分大小写(默认行为是仅接受JanFeb等值。这些月份名称是英文缩写,因此您还必须使用英语区域设置以确保它正确解析名称(使用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);

这将使您的代码有效(datediff将为32)。

答案 1 :(得分:3)

以下代码有效。问题是你使用的是“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);  

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

答案 2 :(得分:1)

尝试使用DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-LLL-yyyy",Locale.ENGLISH);

答案 3 :(得分:0)

也许您可以使用此通配符,

 String d2arr[] = {
            "2016-12-21",
            "1/17/2016",
            "1/3/2016",
            "11/23/2016",
            "OCT 20 2016",
            "Oct 22 2016",
            "Oct 23", // default year is 2016
            "OCT 24",  // default year is 2016
    };

    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder()
            .parseCaseInsensitive().parseLenient()
            .parseDefaulting(ChronoField.YEAR_OF_ERA, 2016L)
            .appendPattern("[yyyy-MM-dd]")
            .appendPattern("[M/dd/yyyy]")
            .appendPattern("[M/d/yyyy]")
            .appendPattern("[MM/dd/yyyy]")
            .appendPattern("[MMM dd yyyy]");

    DateTimeFormatter formatter2 = builder.toFormatter(Locale.ENGLISH);

https://coderanch.com/t/677142/java/DateTimeParseException-Text-parsed-unparsed-text enter link description here

答案 4 :(得分:0)

// DateTimeFormatterBuilder provides custom way to create a
    // formatter
    // It is Case Insensitive, Nov , nov and NOV will be treated same
    DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
            .append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
    try {
        LocalDate datetime = LocalDate.parse("2019-DeC-22", f);
        System.out.println(datetime); // 2019-12-22
    } catch (DateTimeParseException e) {
        // Exception handling message/mechanism/logging as per company standard
    }