tl; dr
Konwersja przestarzałych java.util.Date
obiektów do ich wymiany, java.time.Instant
. Następnie oblicz czas, który upłynął jako Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d. do Minut (): 154
d.toMinutesPart (): 34
Format ISO 8601: PnYnMnDTnHnMnS
Rozsądna norma ISO 8601 definiuje zwięzłą tekstową reprezentację przedziału czasu jako liczbę lat, miesięcy, dni, godzin itp. Norma określa taki przedział czasu . Format oznacza, PnYnMnDTnHnMnS
że P
oznacza „okres”, T
oddziela część daty od części czasu, a pomiędzy nimi są liczby, po których następuje litera.
Przykłady:
P3Y6M4DT12H30M5S
trzy lata, sześć miesięcy, cztery dni, dwanaście godzin, trzydzieści minut i pięć sekund
PT4H30M
Cztery i pół godziny
java.time
Java.time ramy wbudowany w Java 8 i później wypiera kłopotliwe stare java.util.Date
/ java.util.Calendar
klas. Nowe klasy inspirowane są bardzo udanym frameworkiem Joda-Time , przeznaczonym jako jego następca, podobnym w koncepcji, ale przebudowanym. Zdefiniowane przez JSR 310 . Rozszerzony o projekt ThreeTen-Extra . Zobacz samouczek .
Za chwilę
Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Najlepiej unikać klas starszych, takich jak Date
/ Calendar
. Ale jeśli musisz współpracować ze starym kodem, który nie został jeszcze zaktualizowany do java.time , konwertuj tam iz powrotem. Wywołaj nowe metody konwersji dodane do starych klas. Aby przejść z A java.util.Date
do A Instant
, zadzwoń Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Przedział czasu
Klasy java.time podzieliły ideę reprezentowania przedziału czasu jako liczby lat, miesięcy, dni, godzin, minut, sekund na dwie połowy:
Period
przez lata, miesiące, dni
Duration
przez dni, godziny, minuty, sekundy
Oto przykład.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Zrzut do konsoli.
Oba Period
i Duration
używają standardu ISO 8601 do generowania ciągu reprezentującego ich wartość.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
teraz: 2015-11-26T00: 46: 48.016-05: 00 [Ameryka / Montreal] do przyszłości: 2015-11-26T00: 46: 48.016-05: 00 [Ameryka / Montreal] = PT1H3M
Java 9 dodaje metody do Duration
uzyskać część dni, część godzin, część minut i część sekund.
Możesz uzyskać łączną liczbę dni, godzin, minut lub sekund lub milisekund lub nanosekund w całym okresie trwania.
long totalHours = duration.toHours();
W Javie 9 Duration
klasa otrzymuje nowe metody zwracania różnych części dni, godzin, minut, sekund, milisekund / nanosekund. Wywołać to…Part
metody: toDaysPart()
, toHoursPart()
, i tak dalej.
ChronoUnit
Jeśli zależy ci tylko na prostszym, większym ziarnistości czasu, takim jak „liczba dni, które upłynęły”, użyj ChronoUnit
wyliczenia.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Inny przykład.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, iSimpleDateFormat
.
Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do java.time.
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Gdzie można uzyskać klasy java.time?
- Java SE 8 i SE 9 i nowsze
- Wbudowane
- Część standardowego interfejsu API Java z implementacją pakietową.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i SE 7
- Wiele funkcji java.time zostało przeniesionych z powrotem do Java 6 i 7 w ThreeTen-Backport .
- Android
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 .
Joda-Time
AKTUALIZACJA: Projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . Zostawiam tę sekcję nietkniętą dla historii.
Biblioteka Joda-Time używa ISO 8601 jako wartości domyślnej. Jej Period
klasa Analizuje i generuje te PnYnMnDTnHnMnS sznurki.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Renderuje:
period: PT4H30M