Інші відповіді правильні, особливо відповідь 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 Framework (вбудований у Java 8 і пізніші версії, наступник Joda-Time), а також у деяких базах даних, таких як база даних H2 , останнім моментом може бути 23:59.59.999999999
( наносекунд ). Замість того, щоб розщеплювати волосся, подумайте лише з точки зору першого моменту, а не останнього моменту.
У Half-Open день проходить з першого моменту одного дня і закінчується, але не включає першого моменту наступного дня. Тож ніж думайте так:
… З сьогодні о 00:00 (півночі рано вранці) до 12:00 (півночі сьогодні вночі).
… Думай так…
від першого моменту сьогоднішнього дня до, але не враховуючи першого моменту завтра:
(> = 00:00:00.0
сьогодні AND < 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 . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*
заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .