ТЛ; др
Используйте современные классы java.time вместо этих утомительных устаревших классов даты и времени.
myPreparedStatement.setObject(
… ,
Instant.now() // Capture the current moment in UTC.
)
Старые классы даты и времени, плохо разработанные
Если говорить прямо, классы java.sql.Timestamp / .Date / .Time - это взлом, плохой взлом. Как и java.util.Date/.Calendar, они являются результатом неправильного выбора дизайна.
Типы java.sql должны использоваться как можно более кратко, только для передачи данных в / из базы данных. Не используйте для бизнес-логики и дальнейшей работы.
java.time
Старые классы даты и времени были заменены инфраструктурой java.time , встроенной в Java 8 и более поздние версии. Эти новые классы определены в JSR 310, вдохновлены весьма успешной библиотекой Joda-Time и расширены проектом ThreeTen-Extra.
В конце концов мы должны увидеть, что драйверы JDBC обновлены для работы непосредственно с этими типами java.time. Но до этого дня нам нужно конвертировать в / из типов java.sql. Для таких преобразований вызовите новые методы, добавленные к старым классам .
Instant
- это момент времени на UTC с разрешением наносекунд .
Instant instant = myJavaSqlTimestamp.toInstant();
Чтобы пойти в другом направлении:
java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );
Применение часового пояса для получения времени настенных часов .
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Классы java.time имеют тщательно продуманный дизайн классов. Таким образом, вы можете использовать equals
и compareTo
, как и ожидалось. Обратите внимание, что классы со смещением от UTC или часовым поясом также предлагают методы isEqual
, isBefore
и isAfter
. Эти методы сравниваются, учитывая моменты времени, их хронологический порядок. Методы equals
и compareTo
также учитывают смещение или часовой пояс.
Минимизация использования java.sql при одновременном максимизации использования java.time делает вопрос Вопрос спорным.
В Hibernate используйте конвертеры для java.time.
JDBC 4.2
Начиная с JDBC 4.2 и более поздних версий вам вообще не нужно использовать устаревшие классы. Вы можете напрямую обмениваться java.time объектами с вашей базой данных с помощью методов getObject
& setObject
.
myPreparedStatement.setObject( … , instant ) ;
И поиск.
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Обратите внимание, что многие базы данных не могут хранить момент с таким же разрешением, как наносекунды, используемые в java.time . Возможно, вы захотите явно обрезать, а не позволять вашему драйверу JDBC делать это неявно.
Instant instant = Instant.now().truncatedTo( ChronoUnit.MILLIS ) ; // Lop off any nanoseconds & microseconds, keeping only the milliseconds, to match limitations of database.
О 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
и еще .