тл; д-р
В 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 );
мить: 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 . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .
mktimeеквівалент у Java? відняти від нього 60 хвилин?