java.time.format.DateTimeParseException: текст не может быть проанализирован в индексе 3

Я использую 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


person Uma    schedule 05.07.2017    source источник
comment
Попробуйте использовать дд-МММ-гггг   -  person NikNik    schedule 05.07.2017
comment
Это не работает..   -  person Uma    schedule 05.07.2017
comment
Возможный дубликат Как анализировать строки без учета регистра с помощью jsr310 DateTimeFormatter?   -  person Sotirios Delimanolis    schedule 05.07.2017


Ответы (4)


Следующий код работает. Проблема в том, что вы используете «JAN» вместо «Jan». DateTimeFormatter не распознает, что кажется. а также измените шаблон на «д-МММ-гггг».

  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/

person Ramakanth Putta    schedule 05.07.2017
comment
Спасибо. Оно работает. У меня другой вопрос. Позаботится ли он также и о летнем времени? - person Uma; 05.07.2017
comment
У тебя не будет проблем с переходом на летнее время, @Uma. Даже если летнее время начинается, скажем, 26 марта, с 25 по 26 марта остается ровно 1 день. При использовании LocalDate полностью игнорируется, что на самом деле всего 23 часа. Фактически, LocalDate полностью игнорирует любой часовой пояс и, следовательно, любое летнее время. - person Ole V.V.; 05.07.2017

Прежде всего, проверьте 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).

person Community    schedule 05.07.2017
comment
Действительно отличный ответ. Охватывает все, что имеет значение, и прямо в точку. - person Ole V.V.; 05.07.2017
comment
Добавление локали было критически важным и неочевидным из моего сообщения об ошибке (DateTimeParseException: текст не может быть проанализирован по индексу 0). Спасибо за совет! - person Flic; 18.01.2018

Попробуйте использовать DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-LLL-yyyy",Locale.ENGLISH);

person Lukas    schedule 24.10.2019
comment
Я пробовал это, и это не сработало для меня. Это работало только с использованием parseCaseInsensitive(), упомянутого в других решениях. - person eby; 03.11.2020

Может быть, вы можете использовать этот подстановочный знак,

 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введите ссылка на описание здесь

person byte mamba    schedule 14.01.2019