Как преобразовать java.util.Date в java.sql.Date?

tl; dr

Как преобразовать 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.util.Date в java.sql.Date?_datetime-manipulation

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.

Как преобразовать java.util.Date в java.sql.Date?_java-date

Проект 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

2022-10-28T21:02:45+00:00