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

java.time.format.DateTimeParseException: текст «2020-08-21T14:00:00.00+0700» не может быть проанализирован в исключении индекса 20, полученном для кода ниже.

ZonedDateTime.parse(iso8601DateString, "yyyy-MM-dd'T'HH:mm:ss.SSSZ")

он работал в Java 11, но получил исключение в Java 17.

2 ответа

Я рекомендую вам использовать следующиеDateTimeFormatterкоторый может служить для различного количества цифр в долях секунды . Это также будет работать, когда часть секунды (и, следовательно , доля секунды ) отсутствует.

      DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                        .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                        .appendPattern("Z")
                        .toFormatter(Locale.ENGLISH);

В качестве альтернативы вы можете использоватьDateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSZ", Locale.ENGLISH)но это относится только к данной строке даты и времени.

Демо :

      class Main {
    public static void main(String[] args) {
        String strDateTime = "2020-08-21T14:00:00.00+0700";

        // Recommended
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                                .appendPattern("Z")
                                .toFormatter(Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtf);
        System.out.println(odt);

        // Alternatively,
        dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSZ", Locale.ENGLISH);
        odt = OffsetDateTime.parse(strDateTime, dtf);
        System.out.println(odt);
    }
}

Выход :

      2020-08-21T14:00+07:00
2020-08-21T14:00+07:00

ONLINE DEMO

Узнайте больше о современном API Date-Time от Trail: Date Time.

Сработало с 2020-08-21T14:00:00.000+0700, миллисекунды должны быть трехзначными (000)

Другие вопросы по тегам