tl;dr
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.время
Ответ первого игрока правильный, но его можно улучшить, используя современный java.time классы, а не ужасные устаревшие классы (Date
и т. д.).
LocalDate
Для столбца стандартного для SQL типа DATE
используйте класс LocalDate
. LocalDate
a> представляет значение только для даты без времени суток и без часового пояса или смещение от 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.
Полуоткрытый
если (file_getstartdate‹= currentDate‹= file_getendDate){
Вам будет легче работать, если вы будете последовательно использовать полуоткрытый подход к определению промежутка времени. При таком подходе начало включающее, а окончание исключающее. Таким образом, месяц начинается с первого числа и продолжается до первого числа следующего месяца, но не включает его.
Таким образом, логика вашего запроса будет выглядеть следующим образом: <=
и <
.
если (file_getstartdate ‹= текущая дата ‹ file_getendDate)
Это означает, что в 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
работает с полуоткрытым подходом. Но если вы настаиваете на своем полностью закрытом подходе, переопределите его поведение по умолчанию с помощью LocalDateRange.ofClosed
.
О java.time
java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.
Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.
Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. . Этот проект является испытательным полигоном для возможных дополнений к java.time в будущем. Здесь вы можете найти несколько полезных классов, таких как Interval
a>, YearWeek
, YearQuarter
и подробнее.
person
Basil Bourque
schedule
09.04.2019
Date
, независимо от того, был ли этоjava.sql.Date
илиjava.util.Date
. Эти классы плохо разработаны и давно устарели. Вместо этого используйтеLocalDate
из java.time, современного API даты и времени Java. У него есть методыisAfter
,isBefore
иisEqual
, которые сделают то, что вы хотите. - person Ole V.V.   schedule 08.04.2019localeDate
, поскольку он новее и более обновленный, но он доступен только в Java 8. Я помню, что в прошлый раз вы предоставили альтернативное решение относительно использования некоторой функции обратной переносимости, если я правильно помню. - person Daredevil   schedule 08.04.2019