ТЛ; др
if( file_getstartdate<= currentDate<= file_getendDate) { … }
LocalDateRange // Represent a span-of-time as a pair of `LocalDate` (date-only) objects.
.ofClosed( startLocalDate , stopLocalDate ) // Making the date range in fully-closed approach, against my advice of using half-open approach.
.contains( // Compares a specified `LocalDate` against the start and stop dates of the range.
LocalDate.now( // Use `java.time.LocalDate` to represent a date-only value without a time-of-day and without a time zone.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone by which we want to perceive the calendar date for the current moment. "Tomorrow" arrives in Paris France while still "yesterday" in Montréal Québec.
) // Returns a `LocalDate` object.
) // Returns a `boolean` primitive.
java.time
Ответ от Player One правильный, но его можно улучшить, используя современные классы java.time , а не ужасные классы наследства (Date
и т. Д.).
LocalDate
Для столбца типа SQL-стандарта DATE
используйте класс LocalDate
. Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса или смещения от UTC .
Часовой пояс
Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще "вчера" в Монреаль Квебек .
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента. Если критично, подтвердите зону с вашим пользователем.
ZoneID
Укажите собственное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, поскольку мы точно не знаем, намеревались ли вы использовать значение по умолчанию или если вы, как и многие программисты, не знали о проблеме.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
Half-Open
if (file_getstartdate <= currentDate <= file_getendDate) {</p>
Вы найдете свою работу проще, если будете последовательно использовать подход Half-Open для определения промежутка времени. В этом подходе начало включительно , а окончание исключительно . Таким образом, месяц начинается с первого и продолжается, но не включает в себя, первое из следующего месяца.
Таким образом, ваша логика запроса будет, как показано ниже, с <=
& <
.
if (file_getstartdate <= currentDate <file_getendDate) </p>
Это означает, что в SQL не использовать BETWEEN
для работы с датой и временем.
String sql = "SELECT * from tbl WHERE when >= ? AND when < ? ;" ;
…
myPreparedStatement.setObject( 1 , today ) ;
myPreparedStatement.setObject( 2 , today ) ;
Для извлечения DATE
, значения:
LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;
Та же разновидность полуоткрытой логики в коде Java будет выглядеть как следующий код. Обратите внимание, что более короткий способ сказать «равно или позже, чем« есть », не раньше».
boolean isTodayWithinDateRange =
( ! today.isBefore( startDate ) ) // Is today same or later than start…
&& // AND
today.isBefore( stopDate ) // Is today before the stop (for Half-Open approach).
;
Не путать значения даты и времени с текстом
Моя дата хранится в моей таблице в формате ГГГГ-ММ-ДД
Нет, это не так. Тип DATE
в MySQL хранит дату с помощью собственного внутреннего механизма, а не обычного текста.
Объект даты-времени, такой как столбец DATE
в базе данных или LocalDate
в Java, может анализировать ввод строки в значение даты и может генерировать строку из этого значения даты. Но значение даты само по себе не является строкой. Не путайте их. Другими словами, значение даты не имеет «формата», формат имеют только их текстовые представления.
LocalDateRange
Если вы выполняете большую часть этой работы, добавьте в свой проект библиотеку ThreeTen-Extra . Это дает вам доступ к классу LocalDateRange
.
LocalDate start = … ;
LocalDate stop = … ;
LocalDateRange range = LocalDateRange.of( start , stop ) ;
boolean rangeContainsToday = range.contains( today ) ;
По умолчанию класс LocalDateRange
работает с использованием подхода Half-Open. Но если вы настаиваете на своем полностью закрытом подходе, переопределите его поведение по умолчанию с помощью метода LocalDateRange.ofClosed
.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
на выходПодробнее см. Учебное пособие по Oracle .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .