Другие ответы верны, особенно ответ java.time от arganzheng .Как уже упоминалось, вам следует избегать старых классов java.util.Date/.Calendar, поскольку они плохо спроектированы, сбивают с толку и создают проблемы.Они были вытеснены классами java.time.
Позвольте мне добавить примечания о стратегии вокруг обработки в полночь и промежутков времени .
Half-Открыто
В работе с датой и временем промежутки времени часто определяются с использованием подхода «полуоткрытого».В этом подходе начало включительно , а окончание исключительно .Это решает проблемы и, если используется последовательно, значительно упрощает рассуждения об обработке даты и времени.
Одна из решенных проблем - определение конца дня.Последний момент дня 23:59:59.999
( миллисекунды )?Возможно, в классе java.util.Date (с самой ранней Java; хлопотно - избегайте этого класса!) И в очень успешной библиотеке Joda-Time .Но в других программах, таких как базы данных, такие как Postgres, последний момент будет 23:59:59.999999
( микросекунд ).Но в других программах, таких как java.time framework (встроенный в Java 8 и новее, преемник Joda-Time), и в некоторых базах данных, таких как H2 Database , последний момент можетбыть 23:59.59.999999999
( наносекунд ).Вместо того, чтобы расщеплять волосы, думайте только в первый момент, а не в последний момент.
В Half-Open день начинается с первого момента одного дня и идет до, но не включает первый момент следующего дня.Поэтому вместо того, чтобы думать так:
… с сегодняшнего дня в 00:00 (полночь рано утром) до 12:00 (полночь сегодня вечером).
… думайте какэто…
с первого момента сегодняшнего дня, но не включая первый момент завтрашнего дня:(> = 00:00:00.0
сегодня И <<code>00:00:00.0 завтра)
В работе с базой данных этот подход означает не с использованием оператора BETWEEN
вSQL.
начало дня
Кроме того, первый момент дня - , а не , всегда время суток 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
и more .