tl; dr
Converti i tuoi obsoleti java.util.Date
gli 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 è PnYnMnDTnHnMnS
dove il P
"Periodo" significa, T
separa 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.Calendar
classi 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 Instant
classe 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.Date
a 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 Period
e Duration
usano 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 Duration
ottenere 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 Duration
classe ottiene nuovi metodi per restituire le varie parti di giorni, ore, minuti, secondi, millisecondi / nanosecondi. Chiamare i to…Part
metodi: 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' ChronoUnit
enum.
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
, YearQuarter
e 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 Period
classe 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