tl; dr
Как момент в UTC, преобразовать в java.time.Instant
.Затем примените часовой пояс, чтобы получить ZonedDateTime
.Извлечь часть только для даты как LocalDate
.
Однострочник:
Instant
.ofEpochSecond( ts.getSeconds() , ts.getNanos() )
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
Преобразование
Первый шаг - преобразование количества секунд и доли секунды (* наносимых на секунду) объекта Timestamp
* 1015 (наносекунд) к классам java.time .В частности, java.time.Instant
.Как и Timestamp
, Instant
представляет момент в UTC с разрешением наносекунд.
Instant instant = Instant.ofEpochSecond( ts.getSeconds() , ts.getNanos() ) ;
Для определения даты требуется часовой пояс.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.
Примените ZoneId
к нашему Instant
, чтобы получить ZonedDateTime
.Тот же самый момент, та же самая точка на временной шкале, другое время настенных часов.
ZoneId z = ZoneId( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Извлечь часть только для даты в виде LocalDate
.У LocalDate
нет времени суток и часового пояса.
LocalDate ld = zdt.toLocalDate() ;
Осторожно: не используйте для этой цели класс LocalDateTime
, как, к сожалению, показано в другом ответе.В этом классе намеренно отсутствует понятие часового пояса или смещения от UTC.Как таковой, он не может представлять момент, не является точкой на временной шкале.Смотрите документацию класса.
Конвертировать
Лучше всего полностью избегать ужасно утомительных устаревших классов даты и времени, включая Date
, Calendar
, SimpleDateFormat
.Но если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java.time , вы можете конвертировать туда и обратно.Вызовите новые методы преобразования, добавленные к старым классам.
GregorianCalendar gc = GregorianCalendar.from( zdt ) ;
Чтобы представить значение только для даты как GregorianCalendar
, мы должны указать время суток и часовой пояс.Скорее всего, вы захотите использовать первое время дня в качестве компонента времени суток.Никогда не предполагайте, что первый момент 00:00:00.Аномалии, такие как переход на летнее время, означают, что первым моментом может быть другое время, например 01:00:00.Пусть java.time определит первый момент.
ZonedDateTime firstMomentOfDay = ld.atZone( z ) ;
GregorianCalendar gc = GregorianCalendar.from( firstMomentOfDay ) ;
О 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
и more .