ТЛ; др
Проект Joda-Time находится в режиме обслуживания и заменен классами java.time .
- Просто используйте
java.time.Instant
класс.
- Нет необходимости в:
LocalDateTime
java.sql.Timestamp
- Струны
Захватите текущий момент в формате 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. Таким образом, он не представляет момент и не является точкой на шкале времени. A LocalDateTime
представляет собой приблизительное представление о потенциале моментах в диапазоне примерно 26-27 часов.
Используйте a, 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 . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
занятиях.
Где взять классы java.time?
- Java SE 8 , Java SE 9 и более поздние версии
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- В Java 9 добавлены некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP… .
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .
java.sql.Timestamp
класс теперь унаследован, заменен классами java.time , в частности, классомInstant
.