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 .