tl; dr
Converti i tuoi obsoleti java.util.Dategli oggetti per la loro sostituzione, java.time.Instant. Quindi calcolare il tempo trascorso come a 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.toMinutes (): 154
d.toMinutesPart (): 34
Formato ISO 8601: PnYnMnDTnHnMnS
Lo standard sensibile ISO 8601 definisce una concisa rappresentazione testuale di un arco di tempo come un numero di anni, mesi, giorni, ore, ecc. Lo standard chiama tale intervallo di tempo . Il formato è PnYnMnDTnHnMnSdove il P"Periodo" significa, Tsepara la porzione di data dalla porzione di tempo, e in mezzo ci sono numeri seguiti da una lettera.
Esempi:
P3Y6M4DT12H30M5S
tre anni, sei mesi, quattro giorni, dodici ore, trenta minuti e cinque secondi
PT4H30M
Quattro ore e mezza
java.time
Il framework java.time incorporato in Java 8 e successivamente soppianta le vecchie java.util.Date/ java.util.Calendarclassi problematiche . Le nuove classi si ispirano al framework Joda-Time di grande successo , inteso come suo successore, simile nel concetto ma riprogettato. Definito da JSR 310 . Esteso dal progetto ThreeTen-Extra . Vedi il tutorial .
Momento
La Instantclasse rappresenta un momento sulla linea temporale in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Meglio evitare le classi legacy come Date/ Calendar. Ma se devi interagire con il vecchio codice non ancora aggiornato a java.time , converti avanti e indietro. Chiama nuovi metodi di conversione aggiunti alle vecchie classi. Per passare da un java.util.Datea un Instant, chiama Date::toInstant.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Lasso di tempo
Le classi java.time hanno diviso questa idea di rappresentare un arco di tempo come un numero di anni, mesi, giorni, ore, minuti, secondi in due metà:
Period per anni, mesi, giorni
Duration per giorni, ore, minuti, secondi
Ecco un esempio
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Scarica alla console.
Entrambi Periode Durationusano lo standard ISO 8601 per generare una rappresentazione String del loro valore.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
ora: 2015-11-26T00: 46: 48.016-05: 00 [America / Montreal] per il futuro: 2015-11-26T00: 46: 48.016-05: 00 [America / Montreal] = PT1H3M
Java 9 aggiunge metodi per Durationottenere la parte dei giorni, la parte delle ore, la parte dei minuti e la parte dei secondi.
È possibile ottenere il numero totale di giorni o ore o minuti o secondi o millisecondi o nanosecondi nell'intera durata.
long totalHours = duration.toHours();
In Java 9 la Durationclasse ottiene nuovi metodi per restituire le varie parti di giorni, ore, minuti, secondi, millisecondi / nanosecondi. Chiamare i to…Partmetodi: toDaysPart(), toHoursPart(), e così via.
ChronoUnit
Se ti interessa solo una granularità del tempo più semplice, come ad esempio il "numero di giorni trascorsi", usa l' ChronoUnitenum.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Un altro esempio.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione a java.time.
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .
Joda-Time
AGGIORNAMENTO: il progetto Joda-Time è ora in modalità manutenzione , con il team che consiglia la migrazione alle classi java.time . Lascio questa sezione intatta per la storia.
La libreria Joda-Time utilizza ISO 8601 per i suoi valori predefiniti. La sua Periodclasse analizza e genera queste stringhe PnYnMnDTnHnMnS.
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 );
Renders:
period: PT4H30M