Как преобразовать java.util.Date в java.sql.Date?
tl; dr
Как преобразовать java.util.Date datetime-operation в java.sql.Date?
Как преобразовать java.util.Date datetime-operation в java.sql.Date?
Нельзя
Оба класса java-date Date
устарели. Sun, Oracle и сообщество date-of-birth JCP отказались от этих устаревших openjdk классов даты и времени много datetime-functions лет назад, единогласно приняв openjdk JSR 310, определяющий классы java.time.
- Используйте классы java.time вместо устаревших
java.util.Date
иjava.sql.Date
с JDBC 4.2 или новее. - Преобразование в / из java.time при взаимодействии с кодом, который еще не обновлен до java.time.
Наследие | Современный | Конверсия |
---|---|---|
java.util.Date |
java.time.Instant |
java.util.Date.toInstant() java.util.Date.from( Instant ) |
java.sql.Date |
java.time.Date |
java.sql.Date.toLocalDate() java.sql.Date.valueOf( LocalDate ) |
Пример jdk запроса с PreparedStatement
.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
Замены:
-
Instant
вместоjava.util.Date
Оба представляют момент в формате UTC. но теперь с наносекундами вместо миллисекунд. -
LocalDate
вместоjava.sql.Date
Оба представляют значение только для даты без времени суток и без часового пояса.
Подробности
Если вы datetime-functions пытаетесь работать со значениями dates только даты (без времени dates суток, без часового пояса), используйте dates класс LocalDate
, а не java.util.Date
.
java.time
В Java 8 и datetime-manipulation более поздних версиях проблемные openjdk старые классы даты и времени, связанные jre с ранними версиями Java, были jdk вытеснены новым java.time package. См. Oracle Tutorial. Большая datetime часть функций была перенесена sql-query на Java 6 и 7 в ThreeTen-Backport и в дальнейшем sql-query адаптирована для Android date-of-birth в ThreeTenABP.
SQL data type DATE
предназначен только java-date для даты, без времени суток date и часового пояса. В Java datetime-manipulation никогда не было точно такого jre класса † до java.time.LocalDate
в Java 8. Давайте sql-query создадим такое значение, получив datetime сегодняшнюю дату в соответствии java с определенным часовым поясом datetime-manipulation (часовой пояс важен для определения datetime даты, поскольку в Париже datetime-operation наступает новый день раньше, чем sql-syntax в Монреаль, например).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
На date этом все готово. Если ваш datetime-manipulation JDBC driver соответствует JDBC 4.2 spec, вы сможете sql передать LocalDate
через setObject
в PreparedStatement
для сохранения jre в поле SQL DATE.
myPreparedStatement.setObject( 1 , localDate );
Аналогичным jdk образом используйте ResultSet::getObject
для datetime-operation выборки из столбца SQL DATE jre в объект Java LocalDate
. Указание sql-select класса во втором аргументе date-of-birth делает ваш код type-safe.
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Другими словами, весь этот Вопрос не имеет отношения к JDBC 4.2 или date более поздней версии.
Если sql-syntax ваш драйвер JDBC не работает datetime-manipulation таким образом, вам нужно date вернуться к преобразованию datetime в типы java.sql.
Преобразовать в java.sql.Date
Для преобразования openjdk используйте новые методы, добавленные datetime-manipulation к старым классам даты и времени. Мы datetime-functions можем вызвать java.sql.Date.valueOf(…)
для преобразования datetime LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
И идем в другом направлении.
LocalDate localDate = sqlDate.toLocalDate();
Преобразование из java.util.Date
Хотя datetime-manipulation вам следует избегать использования datetime-manipulation старых классов даты и времени, вам datetime-operation может потребоваться это сделать sql при работе с существующим datetime-manipulation кодом. Если да, вы можете date-of-birth конвертировать в / из java.time.
Пройдите datetime-functions через класс Instant
, который представляет sql-select момент на временной шкале sql-select в формате UTC. Instant
по идее похож date-of-birth на java.util.Date
. Но обратите внимание, что openjdk Instant
имеет разрешение до nanoseconds, а openjdk java.util.Date
имеет разрешение только datetime-manipulation milliseconds.
Для преобразования используйте jre новые методы, добавленные openjdk к старым классам. Например, java.util.Date.from( Instant )
и java java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Чтобы определить дату, нам datetime-functions нужен контекст часового пояса. В java любой момент дата меняется sql-query по всему земному шару в зависимости dates от часового пояса. Примените dates ZoneId
, чтобы получить ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† Класс datetime java.sql.Date претендует datetime-functions только на дату без времени datetime-functions суток, но на самом деле использует время datetime-manipulation дня, скорректированное до dates полуночи. Сбивает с толку? Да, старые date-of-birth классы даты и времени - беспорядок.
О java.time
Фреймворк datetime java.time встроен в Java 8 и новее. Эти java-date классы заменяют проблемные jdk старые классы даты и времени openjdk legacy, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы sql-select узнать больше, см. Oracle Tutorial. И поищите jre в Stack Overflow множество datetime-operation примеров и объяснений. Спецификация: JSR 310.
Проект datetime-manipulation Joda-Time, который теперь находится datetime-operation в maintenance mode, рекомендует перейти на datetime-operation классы java.time.
Вы можете обмениваться sql-query объектами java.time непосредственно dates с вашей базой данных. Используйте datetime-operation JDBC driver, совместимый с JDBC 4.2 или более date поздней версии. Нет необходимости dates в строках, нет необходимости date в классах java.sql.*
. Hibernate 5 и datetime-manipulation JPA 2.2 поддерживают java.time.
Где sql-select взять классы java.time?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного API Java со встроенной реализацией.
- В Java 9 внесены некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функций java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android (26+) объединяют реализации классов java.time.
- Для более ранних версий Android (<26) процесс, известный как API desugaring, обеспечивает функциональность subset of the java.time, изначально не встроенную в Android.
- Если обессахаривание не дает того, что вам нужно, проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) к Android. См. How to use ThreeTenABP….
Проект sql-query ThreeTen-Extra расширяет java.time дополнительными java-date классами. Этот проект является date испытательной площадкой для jre возможных будущих дополнений jdk к java.time. Здесь вы можете jdk найти несколько полезных sql-query классов, например Interval
, YearWeek
, YearQuarter
и date-of-birth more.
java
sql
datetime
date
Как преобразовать java.util.Date в java.sql.Date?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.