web-dev-qa-db-ja.com

java.time.format.DateTimeParseException:インデックス3でテキストを解析できませんでした

Java 8を使用して日付を解析し、2つの日付の違いを見つけています。

これが私のスニペットです。

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でテキストを解析できませんでした

12
Uma

次のコードが機能します。問題は、「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/

3
Ramakanth Putta

まず、 javadocを確認してください 。大文字のDday-of-yearフィールド(day-of- month必要に応じて)、大文字のYweek-based-yearフィールド( yearではなく))。正しいパターンは、小文字のdおよびyです。

また、大文字の月名(JANおよびFEB)を使用しているため、フォーマッタは大文字と小文字を区別しない(デフォルトの動作では、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);

これにより、コードが機能します(そしてdatediff32)。

22
user7605325

このワイルドカードを使用できるかもしれませんが、

 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リンクの説明をここに入力

0
forever LA
// 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
    }