Как получить начало и конец дня с помощью Java

Как получить начало и конец дня, используя Java

1. обзор

В этом коротком руководствеwe’ll learn how to get the start and the end of a day in Java используются простые и понятные примеры для различных сценариев.

Мы будем использоватьJava’s 8 Date/Time API для построения этих примеров.

Если вы хотите узнать немного больше о библиотеке даты и времени Java 8, прежде чем продолжить, вы можете начатьhere.

2. Из объектаLocalDate

Прежде всего, давайте посмотрим, как мы можем получить начало или конец дня, предоставленного нам как объектLocalDate, например:

LocalDate localDate = LocalDate.parse("2018-06-23");

2.1. atStartOfDay()с

Самый простой способ получитьLocalDateTime, представляющий начало определенного дня, - использовать методatStartOfDay():

LocalDateTime startOfDay = localDate.atStartOfDay();

Этот метод перегружен, поэтому, если мы хотим получить от негоZonedDateTime, мы можем сделать это, указавZoneId:

ZonedDateTime startOfDay = localDate.atStartOfDay(ZoneId.of("Europe/Paris"));

2.2. of()с

Другой способ достижения того же результата - использование методаof(), предоставляющегоLocalDate и одно из статических полейLocalTime:

LocalDateTime startOfDay = LocalDateTime.of(localDate, LocalTime.MIDNIGHT);

LocalTime предлагает следующие статические поля:MIDNIGHT (00:00),MIN (00:00),NOON (12:00) иMAX (23: 59: 59.999999999).

Следовательно, если мы хотим получить конец дня, мы должны использовать значениеMAX.

Давай попробуем, но другим методом.

2.3. atTime()с

Этот метод перегружен, что позволяет нам указать желаемое время, используя часы, минуты, секунды или даже наносекунды.

В любом случае, в этом случае мы будем использовать полеLocalTime‘sMAX в качестве аргумента для получения последнего момента заданного дня:

LocalDateTime startOfDay = localDate.atTime(LocalTime.MAX);

2.4. atDate()с

Этот пример очень похож на предыдущие, но на этот раз мы воспользуемся методомatDate() объектаLocalTime, передавLocalDate в качестве аргумента:

LocalDateTime endOfDate = LocalTime.MAX.atDate(localDate);

3. Из объектаLocalDateTime

Само собой разумеется, что мы можем получить от негоLocalDate, а затем использовать любой из методов раздела 2, чтобы получить от него конец или начало дня:

LocalDateTime localDateTime = LocalDateTime
  .parse("2018-06-23T05:55:55");
LocalDateTime endOfDate = localDateTime
  .toLocalDate().atTime(LocalTime.MAX);

Но в этом разделе мы проанализируем еще один метод получения объекта с временным разделом, установленным на начало или конец дня, непосредственно из другого заданного объектаLocalDateTime.

3.1. with()с

All classes implementing the Temporal interface can use this method.

В этом случае мы будем использовать сигнатуру метода, который принимает аргументTemporalField (в частности, одно из значенийChronoField Enum) и аргументlong в качестве нового значения поля:

LocalDateTime endOfDate = localDateTime.with(ChronoField.NANO_OF_DAY, LocalTime.MAX.toNanoOfDay());

4. Из объектаZonedDateTime

Если нам заданZonedDateTime,, мы можем использовать методwith(), поскольку он также реализуетTemporal interface:

ZonedDateTime startofDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);

5. Заключение

Подводя итог, мы проанализировали множество различных способов начать и завершить рабочий день на Java для множества различных сценариев.

Наконец, мы узнали об особенностях 8 классов библиотеки даты и времени Java и познакомились со многими из ее классов и интерфейсов.

Как всегда, все примеры доступны вour GitHub repository.