Другие ответы верны, особенно ответ java.time от arganzheng . Как уже упоминалось, вам следует избегать старых классов java.util.Date/.Calendar, поскольку они плохо спроектированы, сбивают с толку и создают проблемы. Они были вытеснены классами java.time.
Позвольте мне добавить заметки о стратегии обработки полуночи и промежутков времени .
Полуоткрытый
В работе с датой и временем промежутки времени часто определяются с использованием подхода «полуоткрытого». В этом подходе начало включительно, а окончание - исключительно . Это решает проблемы и, если используется последовательно, значительно упрощает рассуждения об обработке даты и времени.
Одна решаемая проблема - определение конца дня. Последний момент дня 23:59:59.999
( миллисекунды )? Возможно, в классе java.util.Date (с самой ранней Java; хлопотно - избегайте этого класса!) И в весьма успешной библиотеке Joda-Time . Но в других программах, таких как базы данных, такие как Postgres, последний момент будет 23:59:59.999999
( микросекунды ). Но в других программах, таких как инфраструктура java.time (встроенная в Java 8 и более поздние версии, преемница Joda-Time) и в некоторых базах данных, таких как база данных H2 , последний момент может быть 23:59.59.999999999
( наносекунды ). Вместо того, чтобы раскалывать волосы, думайте только в первый момент, а не в последний момент.
В Half-Open день начинается с первого момента одного дня и идет вверх, но не включает первый момент следующего дня. Так что вместо того, чтобы думать так:
… С сегодняшнего дня в 00:00 (полночь рано этим утром) до 12:00 (полночь сегодня вечером).
... думать так ...
с первого момента сегодняшнего дня, но не включая первый момент завтрашнего дня:
(> = 00:00:00.0
сегодня И < 00:00:00.0
завтра)
В работе с базой данных этот подход означает, что оператор SQL не используется .BETWEEN
Начало дня
Кроме того, первый момент дня не всегда время суток 00:00:00.0
. Переход на летнее время (DST) в некоторых часовых поясах и, возможно, другие аномалии могут означать, что день начинается в другое время.
Так что пусть классы java.time определяют начало дня с помощью вызова LocalDate::atStartOfDay( ZoneId )
. Таким образом, мы должны объехать LocalDate
и вернуться, ZonedDateTime
как вы можете видеть в этом примере кода.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
Обратите внимание на прохождение необязательно ZoneId
. Если этот параметр опущен, текущий часовой пояс JVM по умолчанию применяется неявно. Лучше быть явным.
Часовой пояс имеет решающее значение для работы даты и времени. Вопрос и некоторые другие ответы могут быть ошибочными, поскольку они не обрабатывают сознательно часовой пояс.
Перерабатывать
Если вы должны использовать java.util.Date или .Calendar, ищите новые методы преобразования, добавленные к этим старым классам.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Промежуток времени
Кстати, если вы делаете много работы с промежутками времени, взгляните на:
Duration
Period
Interval
Interval
Класс находится в ThreeTen-Extra проекта, расширение в рамках java.time. Этот проект является полигоном для возможных будущих дополнений к java.time.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .