ТЛ; др
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.asStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
java.time
Давайте обновим эту страницу, показывая код с использованием java.time фреймворка, встроенного в Java 8 и более поздние версии.
Эти новые классы основаны на Joda-Time , определенном JSR 310 и расширенном проектом ThreeTen-Extra . Они вытесняют печально известные старые классы даты и времени, связанные с ранними версиями Java.
В java.time, Instant
- это момент времени на UTC. ZonedDateTime
- это мгновенное значение, настроенное на часовой пояс (ZoneId
).
Здесь важен часовой пояс. Дата September 23, 2007
не может быть переведена на определенный момент времени без применения часового пояса. Учтите, что в Париже новый день наступает раньше, чем в Монреале, где он все еще «вчера».
Кроме того, java.sql.Timestamp представляет дату и время суток. Таким образом, мы должны ввести время суток, чтобы согласовать дату. Мы предполагаем, что вы хотите, чтобы первое время дня было временем суток. Обратите внимание, что это не всегда время 00:00:00.0
из-за перехода на летнее время и, возможно, из-за других аномалий.
Обратите внимание, что в отличие от старого класса java.util.Date и в отличие от Joda-Time, типы java.time имеют разрешение наносекунд, а не миллисекунд. Это соответствует разрешению java.sql.Timestamp.
Обратите внимание, что у java.sql.Timestamp есть неприятная привычка неявно применять текущий часовой пояс по умолчанию вашей JVM к его значению даты и времени при генерации строкового представления с помощью его метода toString
. Здесь вы видите мой часовой пояс America/Los_Angeles
. Напротив, классы java.time более разумны, используя стандартные форматы ISO 8601 .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.asStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Дамп на консоль.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
При запуске.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Америка / Монреаль] = мгновенный: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21 : 00: 00,0
Кстати, начиная с JDBC 4.2, вы можете напрямую использовать типы java.time. Нет необходимости в java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
О 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?
1185 * ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .