java.time
Ответ от BalusC правильный: вы не можете исключить время дня из объекта класса, определенного для хранения даты плюс время дня.
Кроме того, вы используете проблемные старые классы (java.util.Date
и java.sql.Date
), которые теперь устарели и заменены классами java.time .
Вместо этого используйте класс только для даты для значения только для даты.Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.java.sql.Date
делает вид, что делает то же самое, но на самом деле имеет время суток из-за очень плохого проектного решения о наследовании от java.util.Date
.Избегайте java.sql.Date
и используйте вместо него java.time.LocalDate
.
Вы, очевидно, начинаете с java.util.Date
объекта.Это представляет точку на временной шкале в UTC с разрешением в миллисекундах.Поэтому для определения даты требуется часовой пояс.Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.
Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .
Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента.Если опущено, текущее значение по умолчанию JVM применяется неявно.Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
Чтобы получить только датузначение из вашего java.util.Date
, сначала преобразуйте в его java.time замена, Instant
.Для преобразования туда и обратно вызовите новые методы, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
Это значение в UTC по определению.Примените желаемый часовой пояс (ZoneId
), чтобы создать ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z ) ;
Наконец, извлеките желаемый объект LocalDate
из ZonedDateTime
.
LocalDate ld = zdt.toLocalDate() ;
Начиная с JDBC 4.2 и более поздних версий, вы можете напрямую обмениваться классами java.time с вашей базой данных.Поэтому нет необходимости использовать классы java.sql
, такие как java.sql.Date
и java.sql.Timestamp
.
myPreparedStatement.setObject( … , ld ) ;
Retrieval.
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
About 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?
- Java SE 8 , Java SE 9 , а позже
- Встроенный-в.
- Часть стандартного Java API с встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упоминалось выше).См. Как использовать ThreeTenABP… .
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .