Установить время суток для ZonedDateTime в java.time?

Как я могу изменить часть времени существующего ZonedDateTime объект? Я хочу сохранить дату и часовой пояс, но изменить часы и минуты.

1 ответ

Решение

ТЛ; др

zdt.with ( LocalTime.of ( 16 , 15 ) )

Неизменные предметы

Классы java.time используют шаблон Immutable Objects для создания свежих объектов, а не для изменения ("мутирования") исходного объекта.

with()

ZonedDateTime::with Метод является гибким способом создания нового ZonedDateTime основанный на другом, но с некоторым конкретным отличием. Вы можете передать любой объект, реализующий TemporalAdjustor интерфейс.

В этом случае мы хотим изменить только время суток. LocalTime Объект представляет время суток без какой-либо даты и без какого-либо часового пояса. А также LocalTime реализует TemporalAdjustor интерфейс. Так что применяется только это значение времени дня, сохраняя дату и часовой пояс как есть.

ZonedDateTime marketOpens = ZonedDateTime.of ( LocalDate.of ( 2016 , 1 , 4 ) , LocalTime.of ( 9 , 30 ) , ZoneId.of ( "America/New_York" ) );
ZonedDateTime marketCloses = marketOpens.with ( LocalTime.of ( 16 , 0 ) );

Дважды проверьте, что продолжительность промежутка времени, как и ожидалось, составляет шесть с половиной часов.

Duration duration = Duration.between ( marketOpens , marketCloses );

Дамп на консоль.

System.out.println ( "marketOpens: " + marketOpens + " | marketCloses: " + marketCloses + " | duration: " + duration );

marketOpens: 2016-01-04T09: 30-05: 00 [Америка / Нью-Йорк] | marketCloses: 2016-01-04T16:00-05:00[Америка / Нью-Йорк] | продолжительность: PT6H30M

Имейте в виду, что в этом примере мы также неявно корректируем секунды и доли секунды во времени суток. LocalTime объект несет с собой часы, минуты, секунды и доли секунды. Мы указали час и минуту. Наше упущение секунды и доли секунды привело к значению по умолчанию 0 для обоих во время строительства нашего LocalTime, Все четыре аспекта LocalTime были применены, чтобы получить наш свежий ZonedDateTime,

Многие классы реализуют TemporalAdjustor интерфейс. Смотрите список на этом классе документа, в том числе LocalDate, Month, Year, и больше. Таким образом, вы можете передать любой из них, чтобы изменить этот аспект значения даты и времени.

Прочитайте комментарий от Hochschild. Вы должны понимать поведение при указании времени суток, которое недопустимо для определенной даты и зоны. Например, во время перехода на летнее время (DST).

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