tl; dr
Проект Joda-Time находится в режиме обслуживания, теперь его заменяют java.time классы.
- Просто используйте
java.time.Instant
класс. - Нет необходимости:
LocalDateTime
java.sql.Timestamp
- Strings
Захват текущего момента в UTC.
Instant.now()
Для сохранения этого момента в базе данных:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Чтобы извлечь этот момент из базы данных:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Чтобы настроить время настенных часов на время определенного часового пояса.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
неправильный класс
Другие ответы верны, но они не указывают, что LocalDateTime
неправильный класс для вашей цели.
В обоих java.time и Joda-Time , LocalDateTime
преднамеренно лишены какой-либо концепции часового пояса или смещения от UTC.Таким образом, не представляет момент, а не является точкой на временной шкале.LocalDateTime
представляет приблизительное представление о потенциальных моментах в диапазоне около 26-27 часов.
Используйте LocalDateTime
для случаев, когда зона / смещение неизвестна (плохая ситуация) или когда смещение зоны неопределенное.Например, «Рождество начинается в первый момент 25 декабря 2018 года» будет представлено как LocalDateTime
.
. Используйте ZonedDateTime
для представления момента в определенном часовом поясе.Например, Рождество, начинающееся в любой конкретной зоне, такой как Pacific/Auckland
или America/Montreal
, будет представлено объектом ZonedDateTime
.
Для момента всегда в UTC используйте Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Применение часового пояса.Тот же самый момент, та же точка на временной шкале, но просматриваемая с другим временем настенных часов.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Итак, если я могу просто конвертировать между LocalDate и LocalDateTime,
Нет, неправильная стратегия.Если у вас есть значение только для даты, и вы хотите значение даты и времени, вы должны указать время суток.Это время суток может быть недопустимым в эту дату для конкретной зоны - в этом случае класс ZonedDateTime
автоматически корректирует время суток по мере необходимости.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Если вы хотите первыйМомент дня, как ваше время, позвольте java.time определить этот момент.Не думайте, что день начинается в 00:00:00.Аномалии, такие как переход на летнее время (DST), означают, что день может начаться в другое время, например 01: 00: 00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
- неправильный класс
java.sql.Timestamp
является частью проблемных старых классов даты и времени, которые теперь унаследованы и полностью вытеснены классами java.time .Этот класс использовался для представления момента в UTC с разрешением наносекунд .Эта цель теперь выполняется с java.time.Instant
.
JDBC 4.2 с getObject
/ setObject
Начиная с JDBC 4.2 и вышеВаш драйвер JDBC может напрямую обмениваться объектами java.time с базой данных, вызывая:
Например:
myPreparedStatement.setObject( … , instant ) ;
… и…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Преобразовать наследие ⬌ современный
Есливы должны взаимодействовать со старым кодом, который еще не обновлен до java.time , конвертировать туда и обратно, используя новые методы, добавленные к старым классам.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
… и…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
О 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?
- Java SE 8 , Java SE 9 , а позднее
- Встроенный-в.
- Часть стандартного API Java с встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Android
- Более поздние версии реализации комплекта Android классов java.time.
- Для более ранних версий Android (<26) адаптируется проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="noreferrer"> ThreeTenABP ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .