DateTimeFormatter создает исключение DateTimeParseException для строки даты - PullRequest
0 голосов
/ 21 октября 2019

Следующий код генерирует исключение DateTimeParseException:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime dt = ZonedDateTime.parse(
               "2019-01-01",
                formatter.withZone(ZoneId.of("UTC"))
        )

Также выдается исключение с

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime dt = ZonedDateTime.parse(
               "2019-01-01",
                formatter)
        )

Как и

DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
ZonedDateTime dt = ZonedDateTime.parse(
                   "2019-01-01",
                    formatter)
            )

SimpleDateFormatОднако синтаксический анализатор работает очень хорошо - я спорю об его использовании, хотя он не является потокобезопасным и (я полагаю?) должен быть объявлен устаревшим.

Очевидно, что я предпочел бы использовать API java.time,но я не могу заставить эту вещь работать даже после того, как следую за документально подтвержденными примерами онлайн. Что мне делать?

Ответы [ 2 ]

4 голосов
/ 21 октября 2019

A ZonedDateTime должно содержать дату и время;ваш ввод, 2019-01-01, содержит только дату.

По этой причине вы должны использовать LocalDate в сочетании с LocalDate#atTime (чтобы получитьLocalDateTime объект) и LocalDateTime#atZoneZoneOffset.UTC для получения ZonedDateTime).


var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
var zonedDateTime = LocalDate.parse("2019-01-01", formatter)
                             .atTime(1, 2, 3) // (hours, minutes, seconds)
                             .atZone(ZoneOffset.UTC);

Значение zonedDateTime равно:

2019-01-01T01:02:03Z
0 голосов
/ 21 октября 2019

ZoneDateTime или LocalDateTime всегда ожидают пары значений даты и времени. Если у вас нет значения времени, но вам нужно создать экземпляр ZoneDateTime или LocalDateTime, тогда вы можете выбрать некоторое значение времени по умолчанию, например '00:00', и действовать следующим образом:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.parse("2019-01-01", formatter), LocalTime.MIN, ZoneId.of("UTC"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime localDateTime = LocalDateTime.of(LocalDate.parse("2019-01-01", formatter), LocalTime.MIN);

ПРИМЕЧАНИЕ: java.time.LocalTime имеет несколько полезных постоянных времени MIN ('00:00'), MAX ('23: 59: 59.999999999'), MIDNIGHT ('00:00'),NOON ( '12:00')

...