Не удается проанализировать дату с помощью 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]