miércoles, 23 de septiembre de 2009

Calcular la diferencia en días entre dos fechas en Java





Queremos saber los días que han pasado entre dos fechas. Ejemplo: 10-09-2009 y 3-9-2009, su diferencia serían 7 días. Para ello, lo calcularíamos con el siguiente código:


java.util.Date fechaAnterior, fechaPosterior;
diferencia= ( fechaAnterior.getTime() - fechaPosterior.getTime() )/ MILLSECS_PER_DAY;



Ejemplo


Vamos a calcular los días que han pasado desde una fecha dada hasta el día de hoy.


final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día 
java.util.Date hoy = new Date(); //Fecha de hoy 
     
int año = 2009; int mes = 10; int dia = 22; //Fecha anterior 
Calendar calendar = new GregorianCalendar(año, mes-1, dia); 
java.sql.Date fecha = new java.sql.Date(calendar.getTimeInMillis());

long diferencia = ( hoy.getTime() - fecha.getTime() )/MILLSECS_PER_DAY; 
System.out.println(diferencia); 

Nota: Fijémosnos que al inicializar el Calendar hemos restado uno al mes. Ésto se debe a que este parámetro empieza en cero, correspondiendo el cero a Enero, el uno a Febrero, ...




61 Comentarios:

Leonardo dijo...

Gracias!

Felipe dijo...

De nada, me alegro que te sirviera.
Saludos!

Darío dijo...

Se agradece !!! Funciono de 10 e incluso lo pude adaptar para funciones propias.
Muchísimas gracias !!!

Felipe dijo...

Hola Darío, gracias a tí por comentar.

Anónimo dijo...

Oye amigo, me salio un error, en MILLISECS_PER_DAY, me puedes decir como solucionarlo???

Felipe dijo...

Buenas.

¿Qué error te aparece? Supongo que será porque no lo has declarado e inicializado:

final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día

Prueba el código del ejemplo completo.

Saludos.

Anónimo dijo...

Hola, soy aun un pt en la programacion, y quise realizar un cambio al codigo para que aparecieran ventanas para que el usuario ingresara los años, dia y mes, pero no se q pasa, que me aparecen 10 errores en mi consola, es frustrante :(, asi qdo mi codigo erroneo al parecer:

import javax.swing.JOptionPane;
public class NuevoClass {

/** Creates a new instance of NuevoClass */
public NuevoClass() {

final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día
java.util.Date hoy = new Date(); //Fecha de hoy

int año, mes, dia;
String c1;
String c2;
String c3;
c1= JOptionPane.showInputDialog("Teclea el año de tu Nacimiento");
c2 = JOptionPane.showInputDialog("Teclea el mes de tu Nacimiento");
c3 = JOptionPane.showInputDialog("Teclea el Dia de tu Nacimiento");

año = Integer.parseInt (c1);
mes = Integer.parseInt (c2);
dia = Integer.parseInt (c3);


Calendar calendar = new GregorianCalendar(año, mes-1, dia);
java.sql.Date fecha = new java.sql.Date(calendar.getTimeInMillis());

long diferencia = ( hoy.getTime() - fecha.getTime() )/MILLSECS_PER_DAY;
System.out.println(diferencia);
}
}


Espero y me puedan ayudar, si se puede

Felipe dijo...

Buenas.

Me gustaría ayudarte, pero deberías mostrar los errores que te aparecen.

En general si quieres hacer una aplicación de escritorio con interfaz gráfica, te recomendaría que utilizaras el IDE Netbeans, ya que facilita mucho las cosas.

También puedes mirar el manual "Aprenda Java como si estuviera en primero", que puedes encontrar aquí: http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/Java/Java2.pdf
Ahí hay un tema de interfaces gráficas usando Java.

Espero haberte guiado un poco.

Saludos!

Anónimo dijo...

Buenas.

Me gustaría saber si funciona para cambios horarios, por ejemplo, para calcular la diferencia entre 01/03/2010 y 31/03/2010.

Me temo que no.

Felipe dijo...

Hola.

No entiendo bien qué quieres decir con cambios horarios.

Si quieres saber la diferencia en días entre esas dos fechas que mencionas, sí que funciona. No tienes más que probarlo y comentar si te ha funcionado.

Saludos!

Anónimo dijo...

hola amigos tengo 2 problemas que no encuentro solucion
parecen faciles pero la verdad no se como hacerlo




1.-problema en un form de netbeans tengo 3 jTextField y boton

ingreso una fecha 08/09/2010 ..en la 1
ingreso 2... en la 2
y en la tercera me debe mostrar el aumento de dias asi: 10/09/2010
como lo hago???

2.-problema en un form de netbeans tengo un jTextfield y un boton
ingreso una fecha en la caja..13/09/2010 apreto el boton y me debe salir el
nombre del dia de esa fecha es decir si 13..es lunes,o martes ...o domingo
como lo hago???

Felipe dijo...

Buenas.

Problema 1:
Si quieres saber la fecha2 teniendo la fecha1 y el incremento de días, habría que aplicar algo así:

fecha2.getTime() = (long diferencia * MILLSECS_PER_DAY) + fecha1.getTime();

Problema 2:
Puedes utilizar el método GetDayFromDate de la clase DateTimePicker. Visita esta URL:
http://www.ieec.uned.es/ieee/Investigacion/fotored/ver1_21/doc/DateTimePicker.html

Saludos.

Anónimo dijo...

me marca error

ned.java:11: expected
System.out.println(edad);
^
ned.java:11: expected
System.out.println(edad);
^
2 errors

Felipe dijo...

Buenas.

Especifica un poco más qué línea te da el error y qué código es el que estás utilizando, para que te pueda ayudar.

Saludos.

kevin dijo...

alguien sabe pero con horas:minutos:segundos????

Felipe dijo...

Hola Kevin.

Se haría igual, solo que deberías crear el objeto GregorianCalendar, añadiendo esos parámetros.

Es decir, sustituir:
int año = 2009; int mes = 10; int dia = 22; //Fecha anterior
Calendar calendar = new GregorianCalendar(año, mes-1, dia);


por:
int año = 2009; int mes = 10; int dia = 22; int hora = 5; int minuto = 20; int segundo = 10; //Fecha anterior
Calendar calendar = new GregorianCalendar(año, mes-1, dia, hora, minuto, segundo);

He puesto unos valores de ejemplo, tu puedes poner los que quieras.

Espero que te haya ayudado.

Saludos.

Alejandro dijo...

hay una solucion mejor

c.setTimeInMillis(this.getFechaFin().getTime() - this.getFechaInicio().getTime());

y recuperamos el dia con
c.get(Calendar.DAY_OF_YEAR)

donde c es un Calendar

Felipe dijo...

Hola Alejandro.

Es una solución válida también.

Saludos.

Anónimo dijo...

Necesito calcular diferencia entre un inicio de sesion java y un final de sesión para calcular el tiempo de conexión para ello utilizo HttpSession session = request.getSession();
Date l1 = new Date(session.getCreationTime());

Con esto se supone que tenemos la fecha, pero no se como extraer las horas y minutos, parece una pregunta tonta, pero los métodos de la clase Date que hacían esto están "deprecated" y no encuentro la forma de calcular. Alguien podría echarme un cable?

Muchas gracias por adelantado.

Felipe dijo...

Buenas.

Tienes que utilizar el objeto Calendar. Intenta ésto:

Date l1 = new Date(session.getCreationTime());

Calendar cal=Calendar.getInstance();
cal.setTime(l1);
int minutos = cal.get(Calendar.MINUTE);
int horas = cal.get(Calendar.HOUR);


Espero que te sirva.

Saludos.

Anónimo dijo...

Tngo un problema... necesito hallar la deiferncia entre dos fechas.. en netbeans con interfaz grafica por dias,meses y años.

Felipe dijo...

Buenas.

Simplemente tendrás que crearte el interfaz gráfico (con Netbeans es muy sencillo, no hay que escribir código apenas) y una vez que lo tengas, puedes utilizar el código que puse en este post para calcular la diferencia de días. Cualquier problema o duda que te surja estaré encantado de ayudarte.

Saludos.

Anónimo dijo...

hola tengo un problema por que necesito un ejemplo de un programa en java ECLIPSE que realise la conversion de horas a minutos y minutos a segundo por fabor necesito de su ayuda...

Felipe dijo...

Buenas.

Creo que aquí hacen la misma pregunta:

http://mx.answers.yahoo.com/question/index?qid=20080921060104AAj5ny7

Espero que te sirva. Si no es así, especifica un poco más tu pregunta para que pueda ayudarte.

Saludos.

BeDrunkMyFriend dijo...

Hola.
Bueno, no soy el unico con problemas con fechas en java pero si que soy el unico (al menos de momento) con este problema.

Estoy haciendo una pequeña aplicacion para j2me en NetBeans. Tengo un DateField donde introduzco la fecha. Ahora viene el problema que es que quiero con esa fecha sumarle X dias, restarle Y meses y sumarle 1 año (que es la Regla de Naegele para el calculo de la fecha probable de parto). Tambien tengo un TextField donde tiene que aparecer la fecha resultante con formato DD/MM/AAAA.

Muchas gracias.

Felipe dijo...

Hola BeDrunkMyFriend.

Mírate el método add de Calendar:
http://download.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#add(int, int)

Con él vas a poder sumar y restar años, meses y días.

Ejemplo en el que se resta un mes a una fecha:

Calendar c1 = Calendar.getInstance();
c1.set(1999, 0 , 20);
c1.add(Calendar.MONTH, -1); // Restar un mes

Espero que te sirva.

Saludos.

murdock dijo...

Gracias! Justo lo que necesitaba!

Felipe dijo...

Hola murdock.

Gracias a tí por comentar.

Saludos.

fiom9 dijo...

Hola Felipe. No se si sabras a que se debe, pero por lo menos yo he leido y no llego a una respuesta. Cuando creo un calendario, y seteo la fecha al 31 de octubre, se cambia al 01 de noviembre, es decir, toma octubre con 30 dias solamente...

Ojala me puedas ayudar, gracias

Felipe dijo...

Hola fiom9.

Ten en cuenta que los meses se indican numéricamente empezando por el cero. Es decir:

0 -> Enero
1 -> Febrero
2 -> Marzo
...
9 -> Octubre
10 -> Noviembre
11 -> Diciembre

Si pones el mes 10, lo tomará como que es el mes de Noviembre y por tanto tendrá 30 días.

Espero que con ésto soluciones tu problema. Si no es así, coméntamelo e intentaré ayudarte.

Saludos.

Anónimo dijo...

Hola soy Alberto, oye tengo un pequeño problema con las fechas en java con Frames, tengo dos textField cada uno con una fecha y necesito sacar la diferencia de días entre ellos...

Felipe dijo...

Hola Alberto.


Una vez que has obtenido el valor de cada textfield, algo así:

String texto = (nombretextfield.getText());



Debes convertir cada String en un objeto Date. Algo así:

SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");

try
{
Date fecha = formateador.parse(texto);
}
catch (ParseException e)
{
// Error, la cadena de texto no se puede convertir en fecha.
}


Y cuando ya tienes los dos objetos Date, puedes aplicar lo que explico en este post y obtendrás la diferencia en días.

Saludos.

Anónimo dijo...

una pregunta estoy haciendo un frame donde tengo fecha inicial con 3 cuadritos para ingresar dia mes y ano, abajo fecha final con tres cuadros iguales y tengo que calcular la diferencia de dias, alguien me puede ayudar con el codigo, gracias

Felipe dijo...

Hola.

Debes capturar el día, mes y año así (si estás usando textfield para ello):
String dia = (diatextfield.getText());
String mes = (mestextfield.getText());
String año = (añofield.getText());

Y te creas el objeto Calendar y el Date:
Calendar calendar = new GregorianCalendar(año, mes-1, dia);
java.sql.Date fecha = new java.sql.Date(calendar.getTimeInMillis());

La misma operación la haces para la otra fecha.

Finalmente realizas la resta de ambas fechas tal y como indico en este artículo.

Espero haberte ayudado. Si tienes alguna otra consulta, no dudes en comentármelo.

Saludos.

Anónimo dijo...

Hola,
respecto a la comparación de fechas se pueden utilizar las implementaciones que proporciona la libreria joda-time-x.xx.jar.
Así por ejemplo para la diferencia entre fechas tenemos
Days.daysBetween(fecha1,fecha2);
Es bastante útil

Anónimo dijo...

para Anonimo
donde se puede sonseguir esa libreria joda-time-x.xx.jar

Gracias

Rosita dijo...

hola Felipe nose pero creo que me salgo de contexto respecto a fechas, me podrias ayudar para poder sacar numeros perfectos de una list??? o donde te podria subir el codigo para que me lo puedas revisar xfa....... Gracias

Felipe dijo...

Hola.

No conocía, Joda Time, así que gracias por hacer alusión a esa librería. Por lo que estoy leyendo, provee de métodos que hacen más fácil las operaciones con fechas y tiempo. Puede ser útil si se quieren hacer gran número de operaciones o si éstas son complejas. Pero si solo queremos hacer una resta de fechas, como en este caso, mi recomendación es no añadir más librerías al proyecto, ya que con un método sencillo se podría hacer.

La página oficial es http://joda-time.sourceforge.net/, de donde también se pueden bajar las librerías.

Rosita: Si quieres, envíame tu código a mi correo electrónico ( felipejr233 (arroba) gmail.com ) e intentaré ayudarte.

Saludos a todos.

Anónimo dijo...

Hola alguno me puede ayudar tengo q introducir en un jtextfield el año en el q naci y cuando lo introduzca q me haga un calculo y me diga su edad es xxx. no se cm hacerlo ni idea ayudenme xfa

Felipe dijo...

Hola.

Debes capturar el día, mes y año así (si estás usando textfield para ello):
String dia = (diatextfield.getText());
String mes = (mestextfield.getText());
String año = (añofield.getText());

Y te creas el objeto Calendar y el Date:
Calendar calendar = new GregorianCalendar(año, mes-1, dia);
java.sql.Date fecha1 = new java.sql.Date(calendar.getTimeInMillis());

Para el día de hoy:
java.util.Date hoy = new Date();


Luego puedes utilizar la librería joda-time-x.xx.jar y el método siguiente para que te la resta en años:
Years.yearsBetween(fecha1,fecha2);


Saludos.

Ricardo dijo...

Hola, espero puedas ayudarme!. Como puedo utilizar este método pero obteniendo los datos de la fecha a partir de un archivo excel?.
Uso la libreria jxl para leer los datos, y hasta el momento me funciona, pero solo logro leer la fecha en Formato DATE y no se como utilizarlo para llevarlo a gregorianCalendar.
Este es el codigo que llevo.

-----------------
Date actual=new Date();
try{
Workbook libro = Workbook.getWorkbook(new File(archivo));
Sheet hoja = libro.getSheet(0);

final long MILLSECS_PER_DAY = 60 * 60 * 1000; //Milisegundos al día
int numFilas = hoja.getRows();

Date fecha=deStringToDate(hoja.getCell(5,2).getContents());
System.out.println(fecha);
long fecha2= (actual.getTime()-fecha.getTime())/MILLSECS_PER_DAY;

System.out.println(fecha2);

Felipe dijo...

Hola Ricardo.

Si quieres convertir tu objeto fecha, en un objeto GregorianCalendar, puedes hacerlo de la siguiente forma:

GregorianCalendar cal = null;
cal.setTime(fecha);

Si tienes dudas, coméntamelo.

Saludos.

Ricardo dijo...

Me fue bien! Al fin pude solucionar un problema con el formato.
Ahora tengo un problema al restar las fechas, ya que en vez de tomarme la diferencia entre hoy y mañana como 1, me lo toma como 0.
Este es el codigo que tengo

final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día
Calendar hoy = GregorianCalendar.getInstance();

//Recorro Cada Dato de la lista
for(lista.setFirst();!lista.eol();lista.next()){
Calendar date = ((OrdenDeTrabajo)lista.currValue()).getFechaEntrega();


//System.out.println("Fecha excel" + deCalendarToString(date)+ "Fecha actual "+deCalendarToString(hoy));
long fecha=date.getTimeInMillis();

long diferencia = ( fecha-hoy.getTimeInMillis() )/MILLSECS_PER_DAY;
System.out.println(diferencia);

Felipe dijo...

Hola Ricardo.

Comentarte varias cosas. La variable "hoy" ¿A qué fecha corresponde?. Lo mejor es que la inicialices como te indico en el post:
java.util.Date hoy = new Date(); //Fecha de hoy

La variable "fecha" ¿A qué fecha corresponde?.

Si haces ésto, ¿qué salida te da?:

long diferencia = fecha-hoy.getTimeInMillis() ;
System.out.println(diferencia);

Necesito que me respondas a todas esas preguntas para que pueda ayudarte.

Saludos.

Anónimo dijo...

tengo que calcular la multa de un alquiler de peliculas tengo una fecha en mi base de datos de mysql y otra en otra jtable como hago para calcular la diferencia de dias de las dos fechas
desde ya gracias desde paraguay

Anónimo dijo...

Date fecha1 = null,fecha2 = null;
final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día

String texto = (txt1.getText());
String texto2 = (txt1.getText());
SimpleDateFormat formateador = new SimpleDateFormat("yyy,mm,dd");

try
{
fecha1 = formateador.parse(texto);

}
catch (ParseException e)
{
// Error, la cadena de texto no se puede convertir en fecha.
}
try
{

fecha2 = formateador.parse(texto2);
}
catch (ParseException e)
{
// Error, la cadena de texto no se puede convertir en fecha.
}


GregorianCalendar cal = null;
cal.setTime(fecha1);
GregorianCalendar cal2 = null;
cal2.setTime(fecha2);
java.sql.Date fecha3 = new java.sql.Date(cal.getTimeInMillis());
java.sql.Date fecha4 = new java.sql.Date(cal2.getTimeInMillis());

long diferencia = ( fecha1.getTime() - fecha2.getTime() )/MILLSECS_PER_DAY;
System.out.println(diferencia);
no puedo hallar la diferencia de las fechas

Felipe dijo...

Hola.

Convierte tus fechas a tipo java.util.Date (mira como lo hago en el ejemplo). Tu estás creando objetos del tipo java.sql.Date y puede que ese sea el problema. Intenta a corregir eso y si sigues sin poder calcular la diferencia, coméntamelo.

Saludos.

Israel Conde dijo...

que tal ya copie todo el codigo y me aparecen estos errores que es lo que estoy haciendo mal gracias

Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build
Updating property file: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\built-jar.properties
Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\classes
Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\empty
Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\generated-sources\ap-source-output
Compiling 2 source files to C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\classes
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\NewClass.java:13: error: expected
diferencia= ( fechaAnterior.getTime() - fechaPosterior.getTime() )/ MILLSECS_PER_DAY;
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\NewClass.java:23: error: expected
System.out.println(diferencia);
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\NewClass.java:23: error: expected
System.out.println(diferencia);
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\diferencia.java:13: error: expected
diferencia= ( fechaAnterior.getTime() - fechaPosterior.getTime() )/ MILLSECS_PER_DAY;
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\diferencia.java:24: error: expected
System.out.println(diferencia);
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\diferencia.java:24: error: expected
System.out.println(diferencia);
6 errors
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\nbproject\build-impl.xml:915: The following error occurred while executing this line:
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\nbproject\build-impl.xml:268: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 0 seconds)

Israel Conde dijo...

Ya sólo me aparece este error

Updating property file: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\built-jar.properties
Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\classes
Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\empty
Created dir: C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\generated-sources\ap-source-output
Compiling 1 source file to C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\build\classes
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\src\diferencia.java:27: error: reached end of file while parsing
}
1 error
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\nbproject\build-impl.xml:915: The following error occurred while executing this line:
C:\Users\Israel\Documents\NetBeansProjects\JavaLibrary2\nbproject\build-impl.xml:268: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 0 seconds)

Felipe dijo...

Hola Israel.

Los mensajes de error que te aparecen no son muy descriptivos. Muéstrame algo de tu código e intentaré ayudarte. Si utilizas el mismo código de este post no debería de darte ningún error.

Saludos.

yottapc pcplus dijo...

hola buenas tardes estoy trabajando con java y netbeans tengo un problema tengo 2 jtext y necesito que en un tercer jtext me ponga la diferencia de horas que existe entre ambas por su ayuda gracias

Anónimo dijo...

Muy bien explicado.
Muchas muchas gracias

Alberto.

Felipe Martínez D. dijo...

Hola.

@yottapc pcplus: Por favor, indícame exactamente donde tienes problemas. Puedes calcular la diferencia en días (tal y como lo explico aquí) y a partir de ahí calcular las horas.

@Alberto: de nada. Gracias por comentar!.

Saludos.

junagel dijo...

Hola no se si el código ya no funciona bien por algún motivo o estoy haciendo algo mal, ya que modifico los parámetros de la fecha para verificar que funcione primero con una fecha facil:

int año = 2014; int mes = 1; int dia = 22;

y el resultado que me da es: -16090, algo anda mal porque solo hay algunos días de diferencia, y no tantos.
Lo que necesito hacer es hallar la diferencia entre una fecha dada y la actual, tu código me venía muy bien porque luego con Calendar, con add le sumo los días y me lo formatea, pero parece que no funciona correctamente o algo hago mal

Felipe Martínez D. dijo...

Hola Junagel.

Acabo de probarlo con tus mismos datos y me da un resultado de 26 días. Con lo cual, funciona correctamente. Si necesitas ayuda con tu código, dímelo.

Saludos.

juan perez dijo...

me podrían pasar el código de el proyecto

Felipe Martínez D. dijo...

Hola Juan.

¿Qué código necesitas?.

juan perez dijo...

gracias ya puede hacerlo , excelente código

Felipe Martínez D. dijo...

Gracias a tí por comentar.

Saludos.

Anónimo dijo...

hola mi es jorge castillo, me gustaria saber como obtrener la diferencia de horas y minutos de una persona que comienza a trabajar hoy y termina al dia siguiente

Felipe Martínez D. dijo...

Deberás modificar mi ejemplo para llamar a al constructor de GregorianCalendar utilizando el siguiente formato:

GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)

De esa forma tendrás también en cuenta las horas, minutos y segundos.

Saludos.

Publicar un comentario en la entrada

Felinfo: Java, Linux, Virtualización. Open Source.  ©Template Blogger Green by Dicas Blogger .

TOPO