Разбор даты Scala с помощью java LocalDateTime

Я пытаюсь разобрать дату вроде этой "2020-07-01T00:00:00Z" с помощью java LocalDateTime (в Scala) таким образом:

LocalDateTime.parse("2020-07-01T00:00:00Z", ISO_INSTANT)

но я получаю это исключение:

java.time.format.DateTimeParseException: Text '2020-07-01T00:00:00Z' could not be parsed: Unable to obtain LocalDate from TemporalAccessor

В чем может быть проблема?

это мои библиотеки:

import java.time.format.DateTimeFormatter._
import java.time.LocalDateTime

2 ответа

Решение

Вам необходимо указать зону, в которой LocalDateTime относится к синтаксическому анализу.

LocalDateTime.parse("2020-07-01T00:00:00Z",
        DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault()));

А LocalDateTimeне хранит информацию о зоне, но, абстрактно говоря, она так или иначе связана с ней. МножественныйLocalDateTimes могут быть проанализированы из одной и той же метки времени UTC, т. е. смещение времени конкретной (локальной) зоны добавляется / вычитается.

Не поймите это неправильно с ZonedDateTime. АZonedDateTimeхранит информацию о зоне, поэтому имеет отношение 1:1 к отметке времени UTC. Отметка времени в формате UTC имеет отношение 1:n кLocalDateTimeс.

Вы не должны использовать ISO_INSTANT форматировщик, потому что он предназначен для синтаксического анализа Instants, пока вы хотите LocalDateTime.

Вы должны использовать другой DateTimeFormatter. Вот несколько вариантов. Все это "надмножества"ISO_INSTANT формат.


В качестве альтернативы проанализируйте строку на Instant будет первый:

instant.atZone(ZoneOffset.UTC).toLocalDateTime()
Другие вопросы по тегам