Logo

Foro sobre los Ciclos Formativos de Grado Medio ( SMR ) y Superior ( ASIR, DAI, DAM y DAW ).

Diferencia entre fechas

Foro sobre el módulo > Programación en lenguajes estructurados.

Diferencia entre fechas

Notapor Zynan el 17 Abr 2011, 19:04

Hola tengo que hacer un programa que me saque por pantalla la diferencia entre dos fechas: X años, X meses y X días. En principio iluso de mí pensé que calculando el total de días y a partir de ahí dividiendo entre 365 teniendo en cuenta los restos podría sacarlo; no es así. Si intento calcular la diferencia entre el 23/2/1974 y la actual a día de hoy 17/4/2011 los resultados no concuerdan, e intentado buscar en internet pero la cosa está complicada, casi todo lo que encuectro es para realizar los cálculos en excel. No estoy buscando el código, simplemente la fórmula matemática para realizar el cálculo y ya me curro yo como hacerlo en java. Si alguien me ayuda estaría muy agradecido.

Un saludo y muchas gracias
Avatar de Usuario
Zynan
Usuario FP
Usuario FP
 
Mensajes: 28
Registrado: 10 Nov 2010, 13:16
Ciclo Formativo: DAI / DAM
Curso:
Acceso por: Prueba de Acceso
Provincia: Toledo
Instituto: Juan Bosco

Re: Diferencia entre fechas

Notapor aclivis el 17 Abr 2011, 22:14

Esto no te sirve? En el momento que tengas los dias, es facil sacar los meses y los años.

Debe registrarse para ver este enlace. Gracias por su visita.
Imagen
Avatar de Usuario
aclivis
Iniciado
Iniciado
 
Mensajes: 237
Registrado: 31 Dic 2010, 03:09
Ubicación: Crevillent (Baix Vinalopó)
Ciclo Formativo: No estudio FP
Curso: Ninguno
Provincia: Alicante

Re: Diferencia entre fechas

Notapor Zynan el 19 Abr 2011, 20:08

Eso pensaba yo, saco la cantidad de días que hay entre las dos fechas y a partir de ahí puedo ir sacando los años, mese y días. Voy dividiendo y con los restos de las divisiones voy sacando la información; no es así puesto que cada cuatro años hay un bisiesto, dato que hay que tener en cuenta y aún así el método no me termina de quedar bien, hay pequeñas diferencias de uno o dos días con las pruebes que he realizado.
Encontré una página donde comentaba que había que tener en cuenta los meses y operar según el introducido era mayor o menor que el actual, etc. pero el código que él había escrito tenía errores, con su ejemplo salía perfecto, pero cuando probabas más fechas salías otra vez pequeños errores.
Intentaré continuar con su ejemplo a ver si doy con la teclas y ya comento por aquí.

Un saludo y gracias.
Avatar de Usuario
Zynan
Usuario FP
Usuario FP
 
Mensajes: 28
Registrado: 10 Nov 2010, 13:16
Ciclo Formativo: DAI / DAM
Curso:
Acceso por: Prueba de Acceso
Provincia: Toledo
Instituto: Juan Bosco

Re: Diferencia entre fechas

Notapor aclivis el 19 Abr 2011, 20:51

mmm pues suponía que esos metodos que trabajan con fechas ya tenian en cuenta los años bisiestos.. que raro :S siempre puedes crearte un metodo/funcion que te diga entre 2 años dados (los 2 para hacer la diferencia) cuantos años bisiestos hay, y entonces sumarle esos dias (un dia por cada bisiesto)
Imagen
Avatar de Usuario
aclivis
Iniciado
Iniciado
 
Mensajes: 237
Registrado: 31 Dic 2010, 03:09
Ubicación: Crevillent (Baix Vinalopó)
Ciclo Formativo: No estudio FP
Curso: Ninguno
Provincia: Alicante

Re: Diferencia entre fechas

Notapor Lobo14 el 20 Abr 2011, 11:55

Yo tengo algun ejercicio en C++ sobre fechas, que comprueban años bisiestos, si el mes tiene 30 o 31 dias, o si es Febrero, etc... no se si te podría servir...

Un saludo.
Avatar de Usuario
Lobo14
Moderador FP
Moderador FP
 
Mensajes: 1431
Registrado: 04 Sep 2008, 15:12
Ciclo Formativo: DAI / DAM
Curso:
Acceso por: Prueba de Acceso
Provincia: Huelva
Instituto: I.E.S. La Marisma

Re: Diferencia entre fechas

Notapor Zynan el 21 Abr 2011, 13:49

Hola gracias por vuestra ideas, de momento aún sigo pegándome con el método de marras. Con respecto a comprobar si un año es bisiesto sé como comprobarlo, comprobamos si se cumple o no estas condiciones :

(anno % 4 == 0) && !(anno % 100 == 0 && anno % 400 != 0)

Más o menos tengo encaminado como hacerlo, el problema es a veces el resultado me varía en un día dependiendo de las fechas que reste (normalmente una ficticia respecto a la actual). Os dejo un ejemplo de la lógica que voy a aplicar. Cuando tengo el método completo lo cuelgo y espero vuestras críticas.

Desde el 13 de marzo de 2009 hasta el 5 de abril de 2011.
Primero contamos los dias hasta el 31 de marzo (18 dias), después los meses desde abril hasta diciembre (9 meses), por último los años hasta 2011 (1 año). Nos vamos a la siguiente fecha: como es el 5 de abril serían (3 meses) y 5 dias de abril. Total: 1 año, 12 meses y 23 dias, que sería 2 años y 23 días.

Muchas gracias y un saludo
Avatar de Usuario
Zynan
Usuario FP
Usuario FP
 
Mensajes: 28
Registrado: 10 Nov 2010, 13:16
Ciclo Formativo: DAI / DAM
Curso:
Acceso por: Prueba de Acceso
Provincia: Toledo
Instituto: Juan Bosco

Re: Diferencia entre fechas

Notapor Zynan el 24 Abr 2011, 13:43

Hola bueno parece que por fin he dado con el código que calcula las diferencias reales entre dos fechas, en mi caso lo realiza entre una introducida por teclado comparándola con la fecha del sistema. Creo que funciona correctamente, pero aquí lo dejo para que me lo podais criticar a gusto.

Un saludo.

Calendar fechaActual=Calendar.getInstance (); //Crea un objeto de la clase Calendar y se inicializa con la fecha actual
int añoActual=fechaActual.get(Calendar.YEAR); //Declara la variable añoActual de tipo integer y la inicializa con el valor del año actual
int mesActual=fechaActual.get(Calendar.MONTH); //Declara la variable mesActual de tipo integer y la inicializa con el valor del mes actual
int diaActual=fechaActual.get(Calendar.DAY_OF_MONTH); //Declara la variable diaActual de tipo integer y la inicializa con el valor del dia actual

int añoIntroducido=ES.leeNº("Introduce el año"); //Pide introducir por teclado el valor del año con el que comparar
int mesIntroducido=ES.leeNº("Introduce el mes"); //Pide introducir por teclado el valor del mes con el que comparar
int diaIntroducido=ES.leeNº("Introduce el dia"); //Pide introducir por teclado el valor del día con el que comparar
int diasTotalesMes = 0;

if (mesIntroducido==2) { //Comprueba si el mes introducido es Febrero
if ((añoIntroducido % 4 == 0) && ((añoIntroducido % 100 != 0) || (añoIntroducido % 400 == 0))) { //Si el mes es Febrero compruebe si es un año bisiesto
diasTotalesMes=29; //Si el año es bisiesto mes tiene 29 días
}
else {
diasTotalesMes=28; //Si no es bisiesto el mes tiene 28 días
}
}
else { //Si el mes introducido no es Febrero
if (mesIntroducido<=7) { //Comprueba si está dentro de los primero 7 meses
if (mesIntroducido%2==0) { //Comprueba si el resto de la división del mes entre dos es igual a cero
diasTotalesMes=30; //Si la condición es verdadera el mes tiene 30 días
}
else { //Si el resto de la división no es igual a cero
diasTotalesMes=31; //El mes tiene 31 días
}
}
else {
if (mesIntroducido>7) { //Si el mes introducido es mayor que 7
if (mesIntroducido%2==0) { //Si el resto de la división del mes entre dos es igual a cero
diasTotalesMes=31; //El mes introducido tiene 31 días
}
else { //Si la condición no se cumple
diasTotalesMes=30; //El mes introducido tiene 30 días
}
}
}

}

int diferenciaAños=0, diferenciaMeses=0, diferenciaDias=0; //Inicializamos las variables de tipo integer a cero para almacenar la diferencia real de los años, meses y años

mesIntroducido-=1; //Igualamos el mes introducido al de la fecha del sistema, en java los meses van del 0-11

//Comprueba que la fecha introducida es menor que la fecha actual
if (añoIntroducido==añoActual && mesIntroducido>mesActual || añoIntroducido==añoActual && mesIntroducido==mesActual && diaIntroducido>diaActual) {
System.out.println ("La fecha introducida no puede ser mayor que la fecha actual"); //Comunica el error por pantalla
}
else { //Si la fecha introducida es mayor que la actual
if (mesIntroducido<=mesActual) { //Comprueba si el mes introducido es menor o igual que el mes actual
diferenciaAños=añoActual-añoIntroducido; //Si la condición es correcta calcula la diferencia de años
if (diaIntroducido<=diaActual) { //Comprueba si el día introducido es menor o igual que el día actual
diferenciaDias=diaActual-diaIntroducido; //Si la condición es cierta calcula la diferencia de días
diferenciaMeses=mesActual-mesIntroducido; //Calcula la diferencia de meses
}
else { //Si el día introducido es mayor que mes actual
if (mesIntroducido==mesActual) { //Comprueba si el mes introducido es igual al mes actual
diferenciaAños-=1; //Resta 1 a la diferencia de años
}
diferenciaDias=diasTotalesMes-(diaIntroducido-diaActual); //Si el día introducido es mayor que el actual calcula la diferencia de los días
diferenciaMeses=(mesActual - mesIntroducido - 1 + 12) % 12; //Calcula la diferencia de los meses
}
}
else { //Si la condición no se cumple el mes introducido es mayor que el actual
diferenciaAños=(añoActual-añoIntroducido)-1; //Calcula la diferencia de años
diferenciaMeses=(mesActual-mesIntroducido)+12; //Calcula la diferencia de meses
if (diaIntroducido<=diaActual) { //Si el mes introducido es mayor y el día introducido es menor o igual que el actual
diferenciaDias=diaActual-diaIntroducido; //Calcula la diferencia de días
}
else { //Si la condición no se cumple el día introducido es mayor que el actual
diferenciaDias=diasTotalesMes-(diaIntroducido-diaActual); //Calcula la diferencia de meses
diferenciaMeses-=1; //Resta 1 a la diferencia de meses
}
}
}

System.out.println ("Años: "+diferenciaAños);
System.out.println ("Meses: "+diferenciaMeses);
System.out.println ("Días: "+diferenciaDias);
Avatar de Usuario
Zynan
Usuario FP
Usuario FP
 
Mensajes: 28
Registrado: 10 Nov 2010, 13:16
Ciclo Formativo: DAI / DAM
Curso:
Acceso por: Prueba de Acceso
Provincia: Toledo
Instituto: Juan Bosco

Re: Diferencia entre fechas

Notapor Lobo14 el 24 Abr 2011, 18:28

Es un poco dificil leer el codigo sin tabular y tal, te recomiendo que pongas todo el codigo entre las etiquetas [ c o d e ] y [ / c o d e ] , todo junto claro, y ahi puedes tabular bien el codigo para que se entienda mejor.

Gracias por tu aporte ;)
Avatar de Usuario
Lobo14
Moderador FP
Moderador FP
 
Mensajes: 1431
Registrado: 04 Sep 2008, 15:12
Ciclo Formativo: DAI / DAM
Curso:
Acceso por: Prueba de Acceso
Provincia: Huelva
Instituto: I.E.S. La Marisma


Volver a PLE

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados


cron