DateTimeParseException - не может быть проанализирован в индексе 0 - PullRequest
3 голосов
/ 26 февраля 2020

Я пытаюсь разобрать следующую дату "Wed, 26 Feb 2020 03:42:25 -0800"

String datePattern = "EEE, dd MMM yyyy HH:mm:ss Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(datePattern);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter);

Но я получаю следующую ошибку:

java.time.format.DateTimeParseException: Text 'Wed, 26 Feb 2020 03:42:25 -0800'  
could not be parsed at index 0

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 февраля 2020

Вам необходимо предоставить Locale, который использует язык, использованный датой String. В противном случае средство форматирования примет системный языковой стандарт по умолчанию.

См. Этот пример:

public static void main(String[] arguments) {
    String dt = "Wed, 26 Feb 2020 03:42:25 -0800";
    ZonedDateTime zdt = ZonedDateTime.parse(dt, 
            DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US));
    System.out.println(zdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}

Вывод в моей немецкой системе:

2020-02-26T03:42:25-08:00

Без этого Locale (также может быть UK) Я получаю те же Exception, что и вы.

Добавление
Хороший аргумент, данный @Lino: быть независимым от страны, лучше использовать Locale.ENGLISH, потому что это сохраняет уважение к языку, но не зависит от специфики c Locale страны или региона.

1 голос
/ 26 февраля 2020

Не пытайтесь найти правильную строку шаблона формата и правильный языковой стандарт для вашей строки. Форматер встроен.

    String dateStr = "Wed, 26 Feb 2020 03:42:25 -0800";
    DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
    OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateStr, formatter);

    System.out.println(offsetDateTime);

Вывод:

2020-02-26T03: 42: 25-08: 00

It также работает с ZonedDateTime, но поскольку DateTimeFormatter.RFC_1123_DATE_TIME обрабатывает только смещения (например, суммы смещения или GMT), а не часовые пояса, я нашел OffsetDateTime более подходящим.

DateTimeFormatter.RFC_1123_DATE_TIME всегда ожидает день недели и сокращение месяца в Engli sh, даже если вы явно указываете другую локаль, потому что RF C говорит, что строка в Engli sh. Что может go не так?

...