tl; dr
W UTC :
Instant.now().minus( 1 , ChronoUnit.HOURS )
Lub strefowe:
Instant.now()
.atZone( ZoneId.of ( "America/Montreal" ) )
.minusHours( 1 )
Korzystanie z java.time
Java 8 i nowsze mają wbudowaną nową strukturę java.time .
Instant
Jeśli zależy Ci tylko na czasie UTC (GMT), użyj Instant
klasy.
Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );
Zrzuć na konsolę.
System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );
natychmiastowy: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z
Zwróć uwagę, jak w tej chwili zdarzyło się przeskoczyć z powrotem do wczorajszej daty.
ZonedDateTime
Jeśli zależy Ci na strefie czasowej, użyj ZonedDateTime
klasy. Możesz zacząć od natychmiastowego i przypisać strefę czasową, ZoneId
obiekt. Ta klasa obsługuje niezbędne korekty anomalii, takich jak czas letni (DST) .
Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );
Zrzuć na konsolę.
System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );
natychmiastowy: 2015-10-29T00: 50: 30.778Z
zdt: 2015-10-28T20: 50: 30.778-04: 00 [Ameryka / Montreal]
zdtHourWcześniej: 28-10-2015T19: 50: 30.778-04: 00 [Ameryka / Montreal]
Konwersja
Stare klasy java.util.Date/.Calendar są teraz przestarzałe. Unikaj ich. Są notorycznie kłopotliwe i zagmatwane.
Jeśli musisz użyć starych klas do pracy ze starym kodem, który nie został jeszcze zaktualizowany dla typów java.time, wywołaj metody konwersji. Oto przykładowy kod przechodzący z funkcji Instant lub ZonedDateTime do java.util.Date.
java.util.Date date = java.util.Date.from( instant );
…lub…
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, i SimpleDateFormat
.
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*
klas.
Skąd wziąć klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval
, YearWeek
, YearQuarter
, i więcej .
mktime
odpowiednik w javie? odjąć od tego 60 minut?