ТЛ; др
Как преобразовать 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 .
Тип данных 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 в LocalDate
объект Java . Указание класса во втором аргументе делает ваш код безопасным для типов .
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
, и более .