Установить время суток для 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).