Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

В этом коротком руководстве мы узнаем, как получить начало и конец дня в Java , используя простые и понятные примеры для различных сценариев.

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

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

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

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

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

2.1. вНачалоДня()

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

LocalDateTime startOfDay = localDate.atStartOfDay();

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

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

2.2. из()

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

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

LocalTime предлагает следующие статические поля: ПОЛУНОЧЬ (00:00), МИН (00:00), ПОЛДЕНЬ (12:00) и МАКС (23:59:59,999999999).

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

Попробуем, но другим способом.

2.3. вовремя()

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

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

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

2.4. вдате()

Этот пример очень похож на предыдущие, но на этот раз мы будем использовать метод 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. с()

Все классы, реализующие интерфейс Temporal, могут использовать этот метод .

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

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

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

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

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

5. Вывод

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

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

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