tl; др
В UTC :
Instant.now().minus( 1 , ChronoUnit.HOURS )
Или в зонах:
Instant.now()
.atZone( ZoneId.of ( "America/Montreal" ) )
.minusHours( 1 )
Использование java.time
Java 8 и более поздние версии имеют новую встроенную инфраструктуру java.time .
Instant
Если вас интересует только UTC (GMT), тогдаиспользуйте класс Instant
.
Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );
Дамп на консоль.
System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );
мгновенный: 2015-10-29T00: 37: 48.921Z|instantHourEarlier: 2015-10-28T23: 37: 48.921Z
Обратите внимание, как в этот момент произошло переход к вчерашней дате.
ZonedDateTime
ЕслиВы заботитесь о часовом поясе, используйте класс ZonedDateTime
.Вы можете начать с Мгновенного и назначить часовой пояс, объект ZoneId
.Этот класс обрабатывает необходимые корректировки для таких аномалий, как Летнее время (DST) .
Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );
Дамп на консоль.
System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );
instant:2015-10-29T00: 50: 30,778Z
zdt: 2015-10-28T20: 50: 30.778-04: 00 [Америка / Монреаль]
zdtHourEarlier: 2015-10-28T19:50: 30.778-04: 00 [Америка / Монреаль]
Преобразование
Старые классы java.util.Date/.Calendar теперь устарели.Избежать их.Они общеизвестно хлопотны и сбивают с толку.
Когда вы должны использовать старые классы для работы со старым кодом, еще не обновленным для типов java.time, вызывайте методы преобразования.Вот пример кода, переходящего из Instant или ZonedDateTime в java.util.Date.
java.util.Date date = java.util.Date.from( instant );
… или…
java.util.Date date = java.util.Date.from( zdt.toInstant() );
О 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 .