当前位置: 首页 > 知识库问答 >
问题:

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

庄文栋
2023-03-14

我使用Java8来解析日期并找出两个日期之间的差异。

以下是我的片段:

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解析文本

共有3个答案

西门威
2023-03-14
// 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
    }
郑伟彦
2023-03-14

以下代码有效。问题是您使用的是“JAN”而不是“Jan”。DateTimeFor质无法识别它看起来。并将模式更改为“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/

林子石
2023-03-14

首先,检查javadoc。大写字母D表示年份字段(不是您想要的月份),大写字母Y表示基于周的年份字段(不是您想要的年份)。正确的模式是小写字母d和y。

此外,您使用的月份名称是大写的(JAN和FEB),因此格式化程序必须不区分大小写(默认行为是只接受像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);

这将使您的代码正常工作(而datediff将是32)。

 类似资料: