Не удается проанализировать дату с помощью LocalDateTime?

Я пытаюсь разобрать строку даты с помощью DateTimeFormatter. Я получаю следующее исключение:

Неверный формат даты 10.10.2020 12:00:00 java.time.format.DateTimeParseException: текст '10.10.2020 12:00:00'не может быть проанализирован в индексе 2

 String date="10.10.2020 12:00:00";
  
 String dateTimeFormat = "MM/dd/yyyy HH:mm:ss a";
 String exportTimeZone = "UTC";

 DateTimeFormatter format = DateTimeFormatter.ofPattern(dateTimeFormat);

 LocalDateTime impDateTime = LocalDateTime.parse(StringUtils.trim(date), format);
 ZonedDateTime dateInUtc = ZonedDateTime.ofInstant(impDateTime.atZone(ZoneId.of(exportTimeZone)).toInstant(), ZoneId.systemDefault());
 return format.format(dateInUtc);
              

Любая помощь будет оценена?

2 ответа

Решение

Читаем сообщение:

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

Индексы отсчитываются от 0, поэтому индекс 2 в 10.10.2020 12:00:00где первая точка (точка, точка). Итак, Java не может разобрать эту точку. Чтобы выяснить, почему, давайте посмотрим на соответствующее место в строке шаблона формата

String dateTimeFormat = "MM/dd/yyyy HH:mm:ss a";

Итак, месяц, 10, был успешно проанализирован, и следующий форматировщик ожидает - косая черта. Несоответствие между косой чертой и точкой объясняет исключение.

Еще один совет: когда становится нетривиальным получить строку шаблона формата для синтаксического анализа, попробуйте сначала отформатировать известную дату:

    System.out.println("To be parsed: " + date);
    LocalDateTime knownDateTime = LocalDateTime.of(2020, Month.OCTOBER, 10, 12, 0);
    System.out.println("Formatted:    " + knownDateTime.format(format));

Вывод в этом случае:

To be parsed: 10.10.2020 12:00:00
Formatted:    10/10/2020 12:00:00 PM

Такой способ печати упрощает выявление различий между тем, что у нас есть, и тем, что форматтер будет ожидать от анализа.

Вы использовали / вместо того .в формате. Кроме того, когда вы используетеHH, это означает, что это 24-часовой формат, а не am/pm и поэтому вы не должны использовать a с HHв формате. Более того, в вашей строке даты и времени нетam/pm в нем, поэтому используя a в формате все равно вызовет ошибку.

Демо:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTime = "10.10.2020 12:00:00";

        // Define the format
        DateTimeFormatter format = DateTimeFormatter.ofPattern("MM.dd.yyyy HH:mm:ss");

        // Parse date-time as using the defined format
        LocalDateTime impDateTime = LocalDateTime.parse(dateTime, format);

        // Get date-time at UTC
        ZonedDateTime dateTimeInUtc = impDateTime.atZone(ZoneId.of("Etc/UTC"));

        // Display
        System.out.println(dateTimeInUtc);
    }
}

Выход:

2020-10-10T12:00Z[Etc/UTC]
Другие вопросы по тегам