ТЛ; др
Как конвертировать java.util.Date в java.sql.Date?
Не. Оба класса устарели.
- Используйте java.time классы вместо устаревших
java.util.Date
& java.sql.Date
с JDBC 4.2 или более поздней.
- Конвертировать в / из java.time, если взаимодействует с кодом, который еще не обновлен до java.time.
Пример запроса с 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
Оба представляют значение только для даты без времени суток и без часового пояса.
Подробнее
Если вы пытаетесь работать со значениями только по дате (без времени суток, без часового пояса), используйте класс LocalDate
вместо java.util.Date
.
java.time
В Java 8 и более поздних версиях новые устаревшие классы java.time вытеснили неприятные старые классы даты и времени, связанные с ранними версиями Java. См. Oracle Tutorial . Большая часть функциональности была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
A Тип данных SQL DATE
предназначен только для даты, без времени суток и часового пояса. У Java никогда не было именно такого класса † до java.time.LocalDate
в Java 8. Давайте создадим такое значение, получая сегодняшнюю дату в соответствии с конкретным часовым поясом (часовой пояс важен при определении даты как нового дня) Например, в Париже рассветает раньше, чем в Монреале.
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".
На данный момент, мы можем сделать. Если ваш драйвер JDBC соответствует спецификации JDBC 4.2 , вы сможете передавать LocalDate
через setObject
на PreparedStatement
для хранения в поле SQL DATE.
myPreparedStatement.setObject( 1 , localDate );
Аналогично, используйте ResultSet::getObject
для извлечения из столбца SQL DATE в объект Java LocalDate
. Указание класса во втором аргументе делает ваш код type-safe .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Другими словами, весь этот Вопрос не имеет отношения к JDBC 4.2 или более поздней версии.
Если ваш драйвер JDBC не работает таким образом, вам нужно вернуться к преобразованию в типы java.sql.
Конвертировать в java.sql.Date
Для преобразования используйте новые методы, добавленные к старым классам даты и времени. Мы можем позвонить java.sql.Date.valueOf(…)
, чтобы преобразовать LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
И идет в другом направлении.
LocalDate localDate = sqlDate.toLocalDate();
Преобразование из java.util.Date
Хотя вам следует избегать использования старых классов даты и времени, вас могут заставить работать с существующим кодом. Если это так, вы можете конвертировать в / из java.time.
Пройдите через класс Instant
, который представляет момент на временной шкале в UTC. Instant
по идее похож на java.util.Date
. Но обратите внимание, что Instant
имеет разрешение до наносекунд , в то время как java.util.Date
имеет разрешение миллисекунд .
Для преобразования используйте новые методы, добавленные к старым классам. Например, java.util.Date.from( Instant )
и java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Чтобы определить дату, нам нужен контекст часового пояса. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса. Примените ZoneId
, чтобы получить ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† Класс java.sql.Date претендует на то, чтобы иметь только дату без времени суток, но на самом деле делает время суток, настроенное на полночь. Смешение? Да, старые классы даты и времени - беспорядок.
О 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?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .