Calculando la diferencia en las fechas en Java

Me parece gracioso que Java (o la biblioteca java.util) no tenga una función incorporada para calcular la diferencia en las fechas. Quiero restar una fecha de otra para obtener el tiempo transcurrido entre ellas. ¿Cuál es la mejor manera de hacer esto?

Sé que la manera simple es tomar la diferencia del tiempo en milisegundos y luego convertir eso en días. Sin embargo, quería saber si esto funciona en todos los casos (con horario de verano, etc.).

Sé que la manera simple es tomar la diferencia del tiempo en milisegundos y luego convertir eso en días. Sin embargo, quería saber si esto funciona en todos los casos (con horario de verano, etc.).

Si sus tiempos se derivan de fechas UTC, o son solo la diferencia entre dos llamadas a System.getCurrentTimeMillis () medidas en el mismo sistema, obtendrá un número válido de milisegundos como diferencia, independientemente de cualquier problema de zona horaria. (Por eso todo debería estar usando UTC como formato de almacenamiento; es mucho más fácil ir desde UTC-> hora local; si intenta ir hacia el otro lado, debe almacenar la zona horaria local junto con la hora local). o intenta inferirlo, ¡Gack!)

En cuanto a convertir esto en un número de días, debería ser capaz de dividir por 86400000 … con la advertencia de que hay un segundo intercalar ocasional cada dos años más o menos.

A Java no le falta mucho, si miras el código abierto: prueba Joda-Time .

Use Joda-Time o el nuevo paquete java.time en Java 8.

Ambos marcos usan el enfoque Half-Open donde el comienzo es inclusivo mientras que el final es exclusivo . A veces anotado como [) . Este es generalmente el mejor enfoque para definir períodos de tiempo.

java.time

El marco java.time incorporado en Java 8 y posterior tiene una clase de Period para representar un lapso de tiempo como una cantidad de años, un número de meses y un número de días. Pero esta clase está limitada a días completos, sin representación de horas, minutos y segundos.

Tenga en cuenta que especificamos un huso horario, crucial para determinar una fecha. Por ejemplo, un nuevo día amanece antes en París que en Montreal .

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); LocalDate now = LocalDate.now( zoneId ); LocalDate then = LocalDate.of( 2001, 1, 1 ); Period period = Period.between( then, now ); 

Entonces: 2001-01-01. Ahora: 2015-09-07. Período: P14Y8M6D. Días: 5362

Para días enteros, el horario de verano (DST) es irrelevante.

Si desea contar el total de días, use la enumeración ChronoUnit que incluye algunos métodos de cálculo. Observe que los cálculos son largos.

 long days = ChronoUnit.DAYS.between( then, now ); // "5362" seen above. 

He preguntado sobre hacer un período completo en java.time, que incluye horas, minutos, segundos. No es posible a partir de Java 8. Meno Hochschild sugirió una solución alternativa sorprendente utilizando las bibliotecas integradas: use una clase de Duration encuentra en el paquete javax.xml.datatype .

Joda-Time

Aquí hay un código de ejemplo en Joda-Time 2.3.

 DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); DateTime start = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone ); DateTime stop = new DateTime( 2014, 5, 2, 3, 4, 5, timeZone ); Period period = new Period( start, stop ); 

Al llamar a String obtendrá una representación de cadena en la forma definida por el estándar ISO 8601 , PnYnMnDTnHnMnS .

Con la biblioteca date4j :

 int numDaysBetween = oneDate.numDaysFrom(anotherDate); 

Hay una forma simple de implementarlo. Podemos usar el método Calendar.add con loop. Por ejemplo, como a continuación,

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date beginDate = dateFormat.parse("2013-11-29"); Date endDate = dateFormat.parse("2013-12-4"); Calendar beginCalendar = Calendar.getInstance(); beginCalendar.setTime(beginDate); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); 

Los días menos entre beginDate y endDate, y el código como a continuación,

 int minusDays = 0; while (true) { minusDays++; // Day increasing by 1 beginCalendar.add(Calendar.DAY_OF_MONTH, 1); if (dateFormat.format(beginCalendar.getTime()). equals(dateFormat.format(endCalendar).getTime())) { break; } } System.out.println("The substractation between two days is " + (minusDays + 1)); 

¡Que te diviertas! @. @

No estoy de acuerdo con la afirmación de que Java no tiene un mecanismo para calcular la diferencia entre las fechas.

Java fue diseñado para uso global. Fue diseñado para que no haya un concepto de fecha, solo hay un concepto de “tiempo en milisegundos”. Cualquier interpretación de un tiempo tan universal como la fecha y la hora en un lugar específico bajo una convención específica es meramente una proyección o una vista.

La clase calendario se usa para convertir este tipo de tiempo absoluto en fechas. También puede agregar o quitar componentes de fecha, si realmente lo necesita. La única forma de proporcionar una diferencia en el término de los componentes entre dos veces sería el calendario generado y específico. Por lo tanto, podría argumentar que la biblioteca estándar no incluye un calendario gregoriano lo suficientemente inteligente, y estoy de acuerdo en que deja algunos que desear.

Dicho esto, hay numerosas implementaciones de este tipo de funcionalidad, veo que otros han proporcionado ejemplos.

La implementación de Java de las fechas es pobre. Si encuentras Joda-Time demasiado complicado, prueba mi pequeña contribución al código abierto: http://calendardate.sourceforge.net/javadoc/index.html

    Intereting Posts