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, ...

Actualización: Ante los diversos comentarios al respecto, he creado un post en el que se explica cómo calcular la diferencia en días utilizando la librería Joda Time, podéis encontrarlo aquí: http://felinfo.blogspot.com.es/2015/10/calcular-la-diferencia-en-dias-entre.html




86 Comentarios:

Leonardo dijo...

Gracias!

Felipe Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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.

Unknown dijo...

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

Felipe Martínez D. 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.

Alex Ati 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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.

Unknown 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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 Martínez D. 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.

Octavio Israel 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)

Felipe Martínez D. 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.

Unknown 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.

Unknown dijo...

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

Felipe Martínez D. dijo...

Hola Juan.

¿Qué código necesitas?.

Unknown 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.

Unknown dijo...

hola k tal
nesito de su ayuda kisiera saber como comparar le fecha de hoy con la fecha k ya tengo guaradado en mi bd, pero k sea como un escaneo para saver cual de ellos, tine 13 o menos de 13 dias transcurridos
nesesito ayudda saludos

Felipe Martínez D. dijo...

Hola Roger.

Una vez que has obtenido la fecha de tu BD puedes utilizar el ejemplo de este post para compararla con la fecha actual y obtener la diferencia en días. Luego obtendrás lo que quieres con un simple if: if (diferencia<=13) {...}

Si tienes dudas pregúntame.

Saludos.

Unknown dijo...

hola felipe
me prodrias ayudar a como poser comparar una fecha de mi BD, lo tengo separa dia, mes y año pero no se como sacar los datos de BD y compararlos.
ya cheque tu codigo ysi funciona bien.
pero no se como implemetar.
ya intenete colocarlos mis datos de mi BD en areglos diferentes y despues buscar los uno por uno pero no me sale
este es mi ejemplo:

private void ayActionPerformed(java.awt.event.ActionEvent evt) {
Conectar cc= new Conectar();
Connection cn= cc.conexion();
int h = 0,y = 0 ,m = 0;
String[]t = null;
String[]u = null;
String[]r= null;

try {
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery("SELECT dia FROM autos ");
while(rs.next()){
String o =rs.getString(1);
u=o.split("\n");
for (int i =0; i < u.length; i++){
y =Integer.parseInt(u[i]) ;
}
}
} catch (SQLException ex) {
Logger.getLogger(Inventariok83.class.getName()).log(Level.SEVERE, null, ex);
}

try {
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery("SELECT year FROM autos ");
while(rs.next()){
String k =rs.getString(1);
t=k.split("\n");
for (int j =0; j < t.length; j++){
h =Integer.parseInt(t[j]) ;
//System.out.println(t[j]);
}
}
} catch (SQLException ex) {
Logger.getLogger(Inventariok83.class.getName()).log(Level.SEVERE, null, ex);
}

try {
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery("SELECT mes FROM autos ");
while(rs.next()){
String k =rs.getString(1);
r=k.split("\n");
for (int p =0; p < r.length; p++){
m =Integer.parseInt(r[p]) ;
// System.out.println(r[p]);
}
}
} catch (SQLException ex) {
Logger.getLogger(Inventariok83.class.getName()).log(Level.SEVERE, null, ex);
}
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(h, m-1, y);
java.sql.Date fecha = new java.sql.Date(calendar.getTimeInMillis());

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


}

Unknown dijo...

solo me imprime uno no se en que estoy fallando espero y me puedas ayudra a resolvre mi problema
saludos --...
grasias

Unknown dijo...

espero y me aya esplicado XD
felipe

Felipe Martínez D. dijo...

Hola Roger.

No se a qué te refieres con que sólo te imprime uno. Lo primero que tienes que hacer es obtener la fecha. No pases al siguiente paso hasta que no tengas la fecha que quieres comparar con la fecha actual.

Yo no puedo probar tu código porque no tengo la base de datos, así que no puedo comprobar donde falla.

Saludos cordiales.

Jorge dijo...

Hola,
No se si se tratará de un bug o si es que estoy haciendo algo mal pero si aplico tu código a calcular los días que hay entre el 01/03/2015 y el 01/04/2015 me salen 30 días en lugar de 31. Sin embargo si hago el cálculo entre 01/05/2015 y el 01/06/2015 el resultado que obtengo es 31. No lo entiendo...
En ambos casos debería devolver 31 días ¿por qué falla con Marzo?

Felipe Martínez D. dijo...

Hola Jorge.

He probado tu ejemplo y me aparece el mismo resultado que a tí. Quizás se trate de un bug. He probado con el resto de meses y se muestran los días correctamente. Es muy estraño. Se averiguo algo sobre el tema, lo comentaré aquí.

Saludos cordiales.

Felipe Martínez D. dijo...

Hola Jorge.

Ya he averiguado por qué aparecen 30 días. Resulta que en el mes de marzo se adelantan los relojes una hora, por tanto ese mes tiene una hora menos. Al hacer los cálculos, como no llega al mínimo de milisegundos que debería llegar para obtener como resultado 31 días, pues el resultado son 30 días. No se si me he explicado correctamente.

Aquí hablan de ello: http://www.coderanch.com/t/552851/java/java/Bug-Gregorian-Calendar.

Como alternativa, se podría utilizar la librería JodaTime, como hemos hablado en comentarios anteriores. Es una librería específica para trabajar con fechas. Provee de métodos que hacen más fácil las operaciones con fechas y tiempo. La página oficial es http://joda-time.sourceforge.net/, de donde también se pueden bajar las librerías.

Saludos cordiales.

Unknown dijo...

olaaa alguien sabe con condicionales if else calcular la diferencia entre dos fechas

Coco dijo...

Muy buen trabajo felicidades!
Bueno en mi caso tengo poco tiempo en java y estoy trabajando con AndroidStuido y necesito obtener la diferencia entre fechas en el cual obtenga un resultado asi:
Por ejemplo
Fecha inicial: 01/01/2000
Fecha final: 11/08/2015

Resultado de la operación:
Años: 15
Dias: 227

En pocas que el resultado de la diferncia sea: 15 años con 227 días
Si puedes darme una pista o ayudadita te lo agradeceria mucho

kristel dijo...

hola,necesito saber como parsear una fecha que esta en una matriz de strings.
para luego restar esa fecha que parsee, con la fecha en la que se esta invocando la funcion, para obtener la diferencia de dias enrtre las dos .
\gracias

Felipe Martínez D. dijo...

Hola a todos.

@Jhury Cruz Curo: ¿Tiene que ser necesariamente con condicionales?. Observa el ejemplo que te indico en este

post y verás que no son necesarios condicionales.

@Rubén Gutierrëz: Con mi código obtendrás los días totales, que sería la variable diferencia. Para que el resultado te lo de en años y días hay que hacer la división entera (y te dará los años) y el módulo para que te de los días. Sería añadirle este código:

int año_dif = (int)diferencia / 365;
System.out.println(año_dif);

int dias_dif = (int)diferencia % 365;
System.out.println(dias_dif);


@kristel: Deberías indicarme el formato que tienen las fechas en la matriz de string, para poder ayudarte. Una vez que tengas la fecha, la direncia entre las dos fechas la puedes obtener con el código que muestro en este post.


Saludos.

Alex dijo...

Hola Felipe, consulta como puedo saber la cantidad de meses que hay entre una fecha Fin y una Fecha Inicio en java

Felipe Martínez D. dijo...

Hola.
Puedes hacerlo usando la librería Joda Time, tal y como explico aquí: http://felinfo.blogspot.com.es/2015/10/calcular-la-diferencia-en-dias-entre.html

En la parte "Igualmente podemos calcular los meses entre dos fechas ..." se pone un ejemplo que seguro que te sirve.

Saludos.

Unknown dijo...

Genial!! Gracias

Felipe Martínez D. dijo...

Gracias a tí por comentar. Saludos.

Pablo Bautista dijo...

Buenas, estoy trabajando en AndroidStudio, el usuario introduce la fecha que es guardada en n2(Día) n3(Mes) n4(año) desde la interfaz, al aplicar el código que está arriba me dice que el constructor está vacío. Me pueden decir que tendría que corregir?

public void ejecutar_resultado(View view){

EditText cuadro1=(EditText)findViewById(R.id.exp_totalR);
EditText cuadro2=(EditText)findViewById(R.id.dia);
EditText cuadro3=(EditText)findViewById(R.id.mes);
EditText cuadro4=(EditText)findViewById(R.id.año);
EditText cuadro5=(EditText)findViewById(R.id.levelR);

int n1=Integer.parseInt(cuadro1.getText().toString());
int n2=Integer.parseInt(cuadro2.getText().toString());
int n3=Integer.parseInt(cuadro3.getText().toString());
int n4=Integer.parseInt(cuadro4.getText().toString());
int n5=Integer.parseInt(cuadro5.getText().toString());

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 = n4; int mes = n3; int dia = n2; //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;


Intent i=new Intent(this, Result.class);

i.putExtra("numero1",n1);
i.putExtra("numero2",diferencia);
i.putExtra("numero3",n5);

Felipe Martínez D. dijo...

Hola Pablo.

¿En qué línea de da el error?. ¿Los valores del EditText los obtienes correctamente?.

Saludos.

Unknown dijo...

Hola, no se si alguien mas ya pregunto pero, ¿Como hago para poner una fecha predeterminada en lugar del dia de hoy? por ejemplo: quiero solo anotar cualquier fecha y que me diga cuantos dias han pasado desde el 01/03/1900

Felipe Martínez D. dijo...

Hola.

Lo que tu pides se haría así:

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

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());

int año = 2010; int mes = 10; int dia = 22;
Calendar calendar = new GregorianCalendar(año, mes-1, dia);
java.sql.Date otrafecha = new java.sql.Date(calendar.getTimeInMillis());

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




Saludos.

Unknown dijo...

Buenas, estoy intentando hacer lo mismo, pero la fecha anterior la tengo guardada en un vector y la obtengo haciendo esto:
Date fanterior=Alquileres.elementAt(pos).getFecha();
¿como puedo saber cuantos días han pasado entre las 2 fechas?

Unknown dijo...

He probado ha hacer lo siguiente:
Date fanterior = Alquileres.elementAt(pos).getFecha();
final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día
Date fhoy = new Date(); //Fecha de hoy
int año = fanterior.getYear();
int mes = fanterior.getMonth();
int dia = fanterior.getDay(); //Fechaanterior
Calendar calendar = new GregorianCalendar(año, mes - 1, dia);
java.sql.Date fecha = new java.sql.Date(calendar.getTimeInMillis());
long diferencia = (fhoy.getTime() - fecha.getTime()) / MILLSECS_PER_DAY;
Pero me da como diferencia un numero como este: 693991

Felipe Martínez D. dijo...

Hola Cristóbal.

Indícame qué valores tienen las variables año, mes y día. En principio está todo bien.

Saludos.

Unknown dijo...

Gracias Feline, los valores que me dan son año 117, mes 5 y dia 2, no comprendo porque

Felipe Martínez D. dijo...

Hola Cristóbal.

Entonces el resultado que te da es razonable. Debes de averiguar por qué tu aplicación te devuelve esos datos.

Un saludo.

Publicar un comentario

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

TOPO