DateTimeParseException: текст '2020-04-01T08:53:47.000+02:00 00:00' не может быть проанализирован, неанализируемый текст найден в индексе 29

Получение DateTimeParseExcpetion при попытке преобразовать строку 2020-04-01T08:53:47.000+02:00 00:00

String date = "2020-04-01T08:53:47.000+02:00 00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz");
parsedDate = LocalDateTime.parse(date,formatter).toString();
System.out.println(parsedDate);

3 ответа

Решение

Ваш шаблон не совпадает с вашим String. Проверьте последнюю часть, где находится 000+02:00 00:00.

Ваш шаблон: SSSz

Если вы попробуете это:

String date = "2020-04-01T08:53:47.000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

Это будет работать, потому что ваша дата похожа на ваш узор. Обратите внимание, что каждое число в дате также является шаблоном.

Но для вашей даты есть пустое место, что не имеет смысла, поэтому, удалив его, код работает отлично.

String date = "2020-04-01T08:53:47.000+02:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz");

Вывод:

2020-04-01T08:53:47

Обратите внимание, что z является местным временем и означает "смещение нулевого часа" или "зулусское время" (UTC), и вы можете использовать Locale.

В 00:00в конце строки даты и времени для меня не имеет смысла. Разберите строку даты и времени после ее удаления.

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDate = "2020-04-01T08:53:47.000+02:00 00:00";
        strDate = strDate.substring(0, strDate.lastIndexOf(' '));
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSz", Locale.ENGLISH);
        LocalDateTime parsedDate = LocalDateTime.parse(strDate, formatter);
        System.out.println(parsedDate);

        OffsetDateTime odt = OffsetDateTime.parse(strDate);
        System.out.println(odt);
        System.out.println(odt.getOffset());
    }
}

Вывод:

2020-04-01T08:53:47
2020-04-01T08:53:47+02:00
+02:00

Примечание. Вы можете проанализировать строку даты и времени (после разделения 00:00 с конца) до OffsetDateTime для сохранения информации о смещении зоны.

Используйте встроенный форматтер

Встроенный DateTimeFormatter.ISO_OFFSET_DATE_TIMEсоответствует той части вашей строки, которую мы можем понять. И он может анализировать только эту часть и игнорировать остальное.

    String date = "2020-04-01T08:53:47.000+02:00 00:00";
    ParsePosition pp = new ParsePosition(0);
    OffsetDateTime odt = OffsetDateTime.from(
            DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(date, pp));
    
    System.out.println("Date and time: " + odt);
    System.out.println("Unparsed text: " + date.substring(pp.getIndex()));

Вывод:

Date and time: 2020-04-01T08:53:47+02:00
Unparsed text:  00:00

Поскольку ваша строка содержит смещение от UTC, OffsetDateTime- это правильный класс для анализа. Если бы мы использовали LocalDateTIme, смещение будет проигнорировано, и мы в конечном итоге не будем знать, на каком смещении будет интерпретироваться время, то есть мы не сможем узнать, в какой момент времени это было. С участием OffsetDateTimeмомент времени однозначен. Если вы хотите преобразовать время в свой часовой пояс, преобразовайте в ZonedDateTime (до сих пор не LocalDateTime).

    ZonedDateTime timeInMyTimeZone = odt.atZoneSameInstant(ZoneId.systemDefault());
    System.out.println("Date and time: " + timeInMyTimeZone);

Пример вывода:

Date and time: 2020-04-01T11:53:47+05:00[Asia/Aqtobe]

Ссылки

Ссылки на документацию:

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