tl; dr
Converta seus java.util.Date
objetos obsoletos em sua substituição java.time.Instant
,. Em seguida, calcule o tempo decorrido como 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
A norma sensata ISO 8601 define uma representação textual concisa de um período de tempo como um número de anos, meses, dias, horas etc. O padrão exige esse período como uma duração . O formato é PnYnMnDTnHnMnS
onde os P
meios "Período", oT
separam a parte da data da parte da hora e entre os números são seguidos por uma letra.
Exemplos:
P3Y6M4DT12H30M5S
três anos, seis meses, quatro dias, doze horas, trinta minutos e cinco segundos
PT4H30M
Quatro horas e meia
java.time
O java.time quadro construído em Java 8 e posterior suplanta as velhas problemáticas java.util.Date
/ java.util.Calendar
classes. As novas classes são inspiradas no altamente bem - sucedido framework Joda-Time , pretendido como seu sucessor, similar em conceito, mas re-arquitetado. Definido pelo JSR 310 . Prorrogado pelo projeto ThreeTen-Extra . Veja o tutorial .
Momento
A Instant
classe representa um momento na linha do tempo no UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Melhor evitar as classes herdadas, como Date
/ Calendar
. Mas se você deve operar com código antigo ainda não atualizado para java.time , converta para frente e para trás. Chame novos métodos de conversão adicionados às classes antigas. Para passar de uma java.util.Date
para uma Instant
, ligue Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Período de tempo
As classes java.time dividiram essa ideia de representar um período de tempo como um número de anos, meses, dias, horas, minutos, segundos em duas metades:
Period
por anos, meses, dias
Duration
por dias, horas, minutos, segundos
Aqui está um exemplo.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Despejar no console.
Ambos Period
e Duration
usam o padrão ISO 8601 para gerar uma representação String de seu valor.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
agora: 2015-11-26T00: 46: 48.016-05: 00 [América / Montreal] para o futuro: 2015-11-26T00: 46: 48.016-05: 00 [América / Montreal] = PT1H3M
O Java 9 inclui métodos para Duration
obter a parte dos dias, parte das horas, parte dos minutos e parte dos segundos.
Você pode obter o número total de dias ou horas ou minutos ou segundos ou milissegundos ou nanossegundos em toda a duração.
long totalHours = duration.toHours();
No Java 9, a Duration
classe obtém novos métodos para retornar as várias partes de dias, horas, minutos, segundos, milissegundos / nanossegundos. Chamar os to…Part
métodos: toDaysPart()
, toHoursPart()
e assim por diante.
ChronoUnit
Se você se importa apenas com uma granularidade de tempo maior e mais simples, como "número de dias decorridos", use a ChronoUnit
enumeração.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Outro exemplo.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para java.time.
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Onde obter as classes java.time?
- Java SE 8 e SE 9 e posterior
- Construídas em.
- Parte da API Java padrão com uma implementação em pacote configurável.
- O Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
- Android
- O ThreeTenABP projeto adapta ThreeTen-Backport (mencionado acima) para o Android especificamente.
- Consulte Como usar… .
O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .
Joda-Time
ATUALIZAÇÃO: O projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para o java.time classes . Deixo esta seção intacta para a história.
A biblioteca Joda-Time usa a ISO 8601 para seus padrões. Sua Period
classe analisa e gera essas seqüências 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 );
Renderiza:
period: PT4H30M