1. Обзор
В этом коротком уроке мы узнаем, как получить начало и конец дня в Java , используя простые и понятные примеры для различных сценариев.
Мы будем использовать Java 8 Date/Time API для создания этих примеров.
Если вы хотите прочитать немного больше о библиотеке даты и времени 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 () , предоставляя Локальную дату и одно из статических полей LocalTime :
LocalDateTime startOfDay = LocalDateTime.of(localDate, LocalTime.MIDNIGHT);
Местное время предлагает следующие статические поля: ПОЛНОЧЬ (00:00), МИН (00:00), ПОЛДЕНЬ (12:00) и макс. (23:59:59.999999999).
Поэтому, если мы хотим получить конец дня, мы будем использовать значение MAX .
Давайте попробуем, но другим методом.
2.3. Время работы()
Этот метод перегружен, что позволяет нам указать желаемое время, используя часы, минуты, секунды или даже наносекунды.
В этом случае, в любом случае, мы будем использовать поле Местное время ‘s MAX в качестве аргумента, чтобы получить последний момент данного дня:
LocalDateTime startOfDay = localDate.atTime(LocalTime.MAX);
2.4. на дату()
Этот пример очень похож на предыдущие, но на этот раз мы будем использовать метод устаревший() объекта LocalTime , передавая LocalDate в качестве аргумента:
LocalDateTime endOfDate = LocalTime.MAX.atDate(localDate);
3. Из объекта LocalDateTime
Само собой разумеется, что мы можем получить из него Локальные данные , а затем использовать любой из методов раздела 2, чтобы получить из него конец или начало дня:
LocalDateTime localDateTime = LocalDateTime .parse("2018-06-23T05:55:55"); LocalDateTime endOfDate = localDateTime .toLocalDate().atTime(LocalTime.MAX);
Но в этом разделе мы проанализируем еще один метод получения объекта с его временным разделом, установленным на начало или конец дня, непосредственно из другого заданного LocalDateTime объекта.
3.1. с()
Все классы, реализующие Временный интерфейс , могут использовать этот метод .
В этом случае мы будем использовать сигнатуру метода, который принимает Временное поле (в частности, одно из значений перечисления ChronoField ) и аргумент long в качестве нового значения поля:
LocalDateTime endOfDate = localDateTime.with(ChronoField.NANO_OF_DAY, LocalTime.MAX.toNanoOfDay());
4. Из объекта ZonedDateTime
Если нам дано ZonedDateTime, мы можем использовать метод with () , поскольку он также реализует Временный интерфейс :
ZonedDateTime startofDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);
5. Заключение
Подводя итог, мы проанализировали множество различных способов получить начало и конец дня в Java для многих различных сценариев.
Наконец, мы узнали об особенностях 8 классов библиотеки даты и времени Java и познакомились со многими ее классами и интерфейсами.
Как всегда, все примеры можно найти в нашем репозитории GitHub .