tl; dr
Convertir sus obsoletos java.util.Date
objetos para su sustitución, java.time.Instant
. Luego calcule el tiempo transcurrido 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
El estándar sensible ISO 8601 define una representación textual concisa de un lapso de tiempo como un número de años, meses, días, horas, etc. El estándar llama a dicho lapso una duración . El formato es PnYnMnDTnHnMnS
donde P
significa "Período", T
separa la porción de fecha de la porción de tiempo, y en el medio hay números seguidos de una letra.
Ejemplos:
P3Y6M4DT12H30M5S
tres años, seis meses, cuatro días, doce horas, treinta minutos y cinco segundos
PT4H30M
Cuatro horas y media
java.time
El marco java.time integrado en Java 8 y posterior suplanta a las viejas java.util.Date
/ java.util.Calendar
clases problemáticas . Las nuevas clases están inspiradas en el exitoso marco Joda-Time , pensado como su sucesor, similar en concepto pero rediseñado. Definido por JSR 310 . Ampliado por el proyecto ThreeTen-Extra . Ver el tutorial .
Momento
La Instant
clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Lo mejor es evitar las clases heredadas como Date
/ Calendar
. Pero si debe interactuar con el código antiguo que aún no se ha actualizado a java.time , realice la conversión de un lado a otro. Llame a nuevos métodos de conversión agregados a las clases antiguas. Para pasar de una java.util.Date
a una Instant
, llame Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Lapso de tiempo
Las clases java.time han dividido esta idea de representar un lapso de tiempo como varios años, meses, días, horas, minutos, segundos en dos mitades:
Period
por años, meses, días
Duration
por días, horas, minutos, segundos
Aquí hay un ejemplo.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Volcado a la consola.
Tanto Period
y Duration
utilizar el ISO 8601 estándar para la generación de una representación de cadena de su valor.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
ahora: 2015-11-26T00: 46: 48.016-05: 00 [América / Montreal] a futuro: 2015-11-26T00: 46: 48.016-05: 00 [América / Montreal] = PT1H3M
Java 9 agrega métodos para Duration
obtener la parte de días, parte de horas, parte de minutos y parte de segundos.
Puede obtener el número total de días u horas o minutos o segundos o milisegundos o nanosegundos en toda la Duración.
long totalHours = duration.toHours();
En Java 9, la Duration
clase obtiene nuevos métodos para devolver las distintas partes de días, horas, minutos, segundos, milisegundos / nanosegundos. Llamar a los to…Part
métodos: toDaysPart()
, toHoursPart()
y así sucesivamente.
ChronoUnit
Si solo le importa una mayor granularidad de tiempo más simple, como "número de días transcurridos", use la ChronoUnit
enumeración.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Otro ejemplo.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date
, Calendar
, y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time.
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
- Java SE 8 y SE 9 y posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más .
Joda-Time
ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento , con el equipo que aconseja la migración a las clases java.time . Dejo esta sección intacta para la historia.
La biblioteca Joda-Time utiliza ISO 8601 para sus valores predeterminados. Su Period
clase analiza y genera estas cadenas 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