2009-03-13 28 views
6

Me gustaría hacer cálculos simples de fechas en Java. Por ejemplo, calcule la diferencia en días entre fechas (teniendo un componente de tiempo 0). Por supuesto, puede hacer una resta simple de milisegundos, dividida por el número de milisegundos por día, que funciona bien, hasta que el horario de verano ingrese a la escena. Soy consciente de que son posibles diferentes interpretaciones de la "diferencia en días", en particular, si se debe tener en cuenta el componente de tiempo o no. Supongamos que tenemos un componente de tiempo 0 para simplificar.Cálculos simples de fechas en Java

Este tipo de cálculo parece ser una necesidad muy común, y me gustaría tener una discusión sobre los diferentes enfoques de la pregunta.

+0

JODA TIME !!!!!! (¡Antes de la prisa!) –

+0

[java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) !!!!!! –

Respuesta

11

Me gustaría echar un vistazo a la biblioteca de fecha/hora Joda, y en particular a la clase ReadableInterval.

Joda hace la vida mucho más fácil al manipular fechas/horas en Java, y creo que es la base de la nueva Java JSR 310 wrt. fechas/horas es decir, que (o algo muy similar) estará presente en una versión futura de Java.

+0

FYI, el proyecto [Joda-Time] (http://www.joda.org/joda-time/) está ahora en [modo de mantenimiento] (https://en.wikipedia.org/wiki/Maintenance_mode), con el equipo recomienda la migración a las clases [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). Consulte [Tutorial de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Here is an article discutiendo el uso de las instalaciones de Fecha/Calendario en java para calcular el tiempo transcurrido.

3

Parece que Date, Calendar y DateUtils harán todo lo que estás buscando. http://commons.apache.org/lang/api/org/apache/commons/lang/time/DateUtils.html

DateUtils permite truncar o redondear el tiempo para que pueda ocuparse solo de las fechas. También mencionó el horario de verano. El problema principal es cuando alguien dice que hizo algo a la 01:30 en un día donde hubo un cambio de horario de verano ... ¿qué hora era 01:30? ¿El primero o el segundo? Afortunadamente, esto puede ser manejado por la clase Calendario ya que almacena la zona horaria y el desplazamiento DST. Para los detalles sobre todo eso, mira esto: http://www.xmission.com/~goodhill/dates/deltaDates.html

2

La opción más simple es usar las clases Días, Semanas, Meses y Años en Joda.

De esta manera, se puede hacer algo tan simple como:

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays(); 
+0

Y para convertir sus objetos 'java.util.Date' existentes a 'ReadableIntervals' que puede pasar a' daysBetween', puede hacer: 'new DateTime (somejavautildate)' –

+0

FYI, el [Joda-Time] (http: //www.joda.org/joda-time/) el proyecto está ahora en [modo de mantenimiento] (https://en.wikipedia.org/wiki/Maintenance_mode), y el equipo recomienda la migración a [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) clases. Consulte [Tutorial de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Usando java.time

El enfoque moderno es con las clases java.time, suplantando los legados de edad clases de fecha y hora problemáticos .

calcular la diferencia en días entre las fechas (que tienen un componente de 0 tiempo)

La clase LocalDate representa un valor de fecha de sólo sin tiempo de día y sin zona horaria.

Enum tiene algunos métodos útiles como between.

En la definición de espacios de tiempo, las clases java.time utilizan el enfoque de medio abierto, donde el principio es incluido, mientras que el final es exclusiva .

LocalDate start = LocalDate.of(2017 , Month.JANUARY , 23); 
LocalDate stop = LocalDate.of(2017 , Month.FEBRUARY , 17); 
long daysBetween = ChronoUnit.DAYS.between(start , stop); 

Puede representar ese espacio de tiempo como un objeto, utilizando la clase Period.

Period p = Period.between(start , stop); 

Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter y more.