Т.Л., д-р
myPreparedObject.setObject(
1 ,
myJavaUtilDate.toInstant() // Convert legacy object to modern java.time object, `Instant`.
)
Подробности
Другие ответы правильны. Класс java.util.Date
представляет дату и время в UTC. java.sql.Date
представляет собой только дату, без времени суток. Ну, на самом деле, java.sql.Date
претендует на то, что представляет только дату, но фактически, как плохо разработанный подкласс, подклассы класса java.util.Date
и, следовательно, имеет время суток. Смешение? Да. Одна из многих причин избежать этих ужасных старых классов наследия.
Теперь у нас есть лучший способ - классы java.time.
java.time
В прежние времена вы бы преобразовать java.util.Date
объект в java.sql.Timestamp
.
Теперь с помощью JDBC driver, поддерживающего JDBC 4.2 и более поздние версии, вы можете отправлять свои объекты java.time непосредственно в/из базы данных. Не нужно ни для классов java.util, ни для java.sql, просто придерживайтесь классов java.time.
Если вам нужно связать старый код с помощью java.util.Date
, конвертировать в java.time.Instant
, используя новые методы, добавленные в старые классы.
Instant
класса представляет момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Instant instant = myJavaUtilDate.toInstant() ;
обмениваются Instant
с базой данных через PreparedStatement::setObject
и ResultSet::getObject
.
myPreparedStatement.setObject(… , instant) ;
И ...
Instant instant = myResultSet.getObject(… , Instant.class) ;
Чтобы увидеть этот момент через какой-то другой часовой пояс, чем UTC, применить ZoneId
получить ZonedDateTime
.
ZoneId z = ZoneId.of("America/Montreal") ;
ZonedDateTime zdt = instant.atZone(z) ;
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time.Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Вам действительно нужно его преобразовать, если потерять часть времени не то, что вы хотите? Почему бы не использовать java.util.Date прямо в вызове jdbc? – stenix
@stenix Я проверил перегрузки метода 'PreparedStatement.setDate()', и ни один из них, похоже, не хочет 'java.util.Date'. Все они работают с типами 'java.sql. *'. –
FYI, вы используете неприятные старые устаревшие классы времени. Теперь вытесняется классами [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). В JDBC 4.2 и более поздних версиях вы можете передавать/извлекать объекты java.time напрямую с помощью методов 'setObject' и' getObject', не переходя типов java.sql. Если нет, найдите новые методы преобразования, добавленные в старые классы. –