org.threeten.bp.format.DateTimeParseException

val dateFormatter= DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd")
        .toFormatter()  

val begin = (LocalDateTime.parse("2019-11-04", dateFormatter).atOffset(ZoneOffset.UTC)
                    .toInstant()).atZone(ZoneId.of(timeZoneIdentifier))

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

Не удалось проанализировать текст '2019-11-04': невозможно получить LocalDateTime от TemporalAccessor: DateTimeBuilder[, ISO, null, 2019-11-04, null], введите org.threeten.bp.format.DateTimeBuilder

2 ответа

Использовать LocalDate вместо LocalDateTime, Нравится:

val begin = (LocalDate.parse("2019-11-04", dateFormatter).atOffset(ZoneOffset.UTC)
                .toInstant()).atZone(ZoneId.of(timeZoneIdentifier))

Но для этого вызова требуется min api 26. Для более старых API см. Здесь

Поскольку 2019-11-04 это формат ISO 8601 и LocalDateа другие классы java.time анализируют формат ISO 8601 по умолчанию, вам не нужно явное средство форматирования. Только это:

    val begin = LocalDate.parse("2019-11-04")
            .atStartOfDay(ZoneOffset.UTC)
            .withZoneSameInstant(ZoneId.of(timeZoneIdentifier))

При условии, что timeZoneIdentifier является Europe/Bucharest в результате ZonedDateTime из 2019-11-04T02:00+02:00[Europe/Bucharest].

Вы не можете разобрать свою строку в LocalDateTime. Для этого потребуется не только дата, но и время суток, а, как вы знаете, ваша строка содержит только первое.

Ссылка: Статья в Википедии: ISO 8601

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