Я использую JodaTime 1.6.2.
У меня есть LocalDate
файл LocalDateTime
, который мне нужно преобразовать либо в (Joda) , либо в или java.sqlTimestamp
для отображения.
Причина этого в том, что я понял, как конвертировать между a LocalDateTime
и a java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Итак, если я могу просто преобразовать между LocalDate
и LocalDateTime
, тогда я могу продолжить преобразование в java.sql.Timestamp
. Спасибо за любые толчки в правильном направлении!
java.sql.Timestamp
класс теперь унаследован, заменен классами java.time , в частности, классомInstant
.Ответы:
JodaTime
Чтобы преобразовать JodaTime
org.joda.time.LocalDate
вjava.sql.Timestamp
, просто выполнитеЧтобы преобразовать JodaTime
org.joda.time.LocalDateTime
вjava.sql.Timestamp
, просто выполнитеJavaTime
Чтобы преобразовать Java8
java.time.LocalDate
вjava.sql.Timestamp
, просто выполнитеЧтобы преобразовать Java8
java.time.LocalDateTime
вjava.sql.Timestamp
, просто выполнитеисточник
LocalDateTime
в, такDateTime
как не всеLocalDateTime
s действительныDateTime
. Источник: joda-time.sourceforge.net/faq.html#illegalinstant и просто столкнулся с этим.Timestamp#valueOf()
метод принимает, поскольку Java SE 1.8 такжеLocalDateTime
.Лучший способ использовать Java 8 time API:
Для использования с JPA, вставленным в вашу модель ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Итак, теперь это относительное время, независимое от часового пояса. Дополнительно легко сделать:
Форматирование:
ОБНОВЛЕНИЕ: postgres 9.4.1208, HSQLDB 2.4.0 и т. Д. Понимают Java 8 Time API без каких-либо разговоров!
источник
ТЛ; др
Проект Joda-Time находится в режиме обслуживания и заменен классами java.time .
java.time.Instant
класс.LocalDateTime
java.sql.Timestamp
Захватите текущий момент в формате UTC.
Чтобы сохранить этот момент в базе данных:
Чтобы получить этот момент из базы данных:
Чтобы настроить время настенных часов в соответствии с определенным часовым поясом.
LocalDateTime
не тот классДругие ответы верны, но они не указывают на то, что
LocalDateTime
это не тот класс для вашей цели.В обоих java.time и Joda-Time ,
LocalDateTime
намеренно отсутствует какая - либо концепция временной зоны или офсетные из-UTC. Таким образом, он не представляет момент и не является точкой на шкале времени. ALocalDateTime
представляет собой приблизительное представление о потенциале моментах в диапазоне примерно 26-27 часов.Используйте a,
LocalDateTime
когда зона / смещение неизвестны (не очень хорошая ситуация), или когда смещение зоны не определено. Например, «Рождество начинается в первый момент 25 декабря 2018 г.» будет представлено какLocalDateTime
.Используйте
ZonedDateTime
для обозначения момента в определенном часовом поясе. Например, Рождество начинается в какой-либо конкретной зоне, например,Pacific/Auckland
илиAmerica/Montreal
может быть представленоZonedDateTime
объектом.На мгновение всегда в формате UTC используйте
Instant
.Применить часовой пояс. Тот же момент, та же точка на временной шкале, но просмотр с другим временем настенных часов.
Нет, неправильная стратегия. Если у вас есть значение только для даты и вам нужно значение даты и времени, вы должны указать время дня. Это время дня может быть недействительным в этот день для определенной зоны - в этом случае
ZonedDateTime
класс автоматически корректирует время дня по мере необходимости.Если вы хотите, чтобы в качестве времени суток был выбран первый момент дня, пусть java.time определит этот момент. Не думайте, что день начинается в 00:00:00. Аномалии, такие как переход на летнее время (DST), означают, что день может начинаться в другое время, например 01:00:00.
java.sql.Timestamp
не тот классЭто
java.sql.Timestamp
часть проблемных старых классов даты и времени, которые теперь унаследованы и полностью вытеснены классами java.time . Этот класс использовался для представления момента в формате UTC с разрешением наносекунды . Этой цели теперь служатjava.time.Instant
.JDBC 4.2 с
getObject
/setObject
Начиная с JDBC 4.2 и новее, ваш драйвер JDBC может напрямую обмениваться объектами java.time с базой данных, вызывая:
PreparedStatement::setObject
ResultSet::getObject
Например:
… и …
Преобразование наследия в современное
Если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time , конвертируйте туда и обратно, используя новые методы, добавленные к старым классам.
…и…
О 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?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
В зависимости от вашего часового пояса вы можете потерять несколько минут (1650-01-01 00:00:00 становится 1649-12-31 23:52:58)
Используйте следующий код, чтобы избежать этого
источник
Поскольку Joda становится блеклой, кто-то может захотеть преобразовать
LocaltDate
ееLocalDateTime
в Java 8. В Java 8LocalDateTime
это даст возможность создатьLocalDateTime
экземпляр с помощьюLocalDate
иLocalTime
. Проверить здесь.Образец будет,
Просто для справки, для получения секунд ниже можно использовать эпоху,
источник
LocalDateTime
Здесь вообще не нужно использовать . В этом классе намеренно отсутствует понятие часового пояса или смещения от UTC. Так что здесь это бесполезно. Вместо этого:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
не предполагайте, что день начинается в 00:00, это не всегда так.java.time.LocalDate.atStartOfDay
для полученияZonedDateTime
. См. Примеры в моем ответе . Как я уже сказал,LocalDateTime
занятия во всем этом бесполезны и контрпродуктивны.LocalDateTime
мы должны использоватьZoneId
?LocalDateTime
это не ассигновать на проблему под рукой здесь.LocalDateTime
Вовсе не представляет собой момент. A неLocalDateTime
имеет ничего общего с какой-либо конкретной местностью или часовым поясом, хотя на первый взгляд название может означать иное - узнайте больше о назначении и деталях этого класса.LocalDateTime
Класс действительно служит цели, но не цель видели в этом вопросе.Вызов функции
asStartOfDay()
наjava.time.LocalDate
объекте возвращаетjava.time.LocalDateTime
объектисточник
Java8 +
источник