Foros del Web » Programando para Internet » Javascript »

Diferencia entre dos fechas en años, meses y días

Estas en el tema de Diferencia entre dos fechas en años, meses y días en el foro de Javascript en Foros del Web. He desarrollado una función muy simple que devuelve la diferencia de años, meses, días y total días entre dos fechas. Los cálculos son exactos. El ...
  #1 (permalink)  
Antiguo 15/11/2012, 16:13
 
Fecha de Ingreso: agosto-2012
Ubicación: Madrid
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 0
Diferencia entre dos fechas en años, meses y días

He desarrollado una función muy simple que devuelve la diferencia de años, meses, días y total días entre dos fechas.
Los cálculos son exactos. El truco para simplificar la función es usar dos variables de fecha auxiliares f1 y f2 y forzar a que f2 siempre sea la mayor de fa y fb y por tanto f1 la menor.
En la red no he encontrado nada similar por lo que me atrevo a publicarla y espero que pueda servir de ayuda.
Código:
function diferenciafechas(fa,fb){  //fa y fb dos fechas
	
	var totdias = fa-fb;
	totdias /=3600000;  
	totdias /=24;	
	totdias= Math.floor(totdias);
	totdias= Math.abs(totdias);

	var ans, meses, dias, m2, m1, d3, d2, d1;
	var f2=new Date();	var f1=new Date();

	if (fa > fb){f2=fa;f1=fb;}else{var f2=fb; f1=fa;}  //Siempre f2 > f1
	ans=f2.getFullYear()-f1.getFullYear(); // dif de años inicial
	m2=f2.getMonth();
	m1=f1.getMonth();
	meses=m2-m1;	if (meses<0){meses +=12; --ans; }

	d2=f2.getDate();
	d1=f1.getDate();
	dias=d2-d1;

	var f3=new Date(f2.getFullYear(),m2,1);
	f3.setDate(f3.getDate()-1);
	d3=f3.getDate();

	if (d1>d2) {
		dias +=d3; --meses; if (meses<0){meses +=12; --ans; }
		if (fa>fb){  //corrección por febrero y meses de 30 días
			f3=new Date(f1.getFullYear(),m1+1,1);
			f3.setDate(f3.getDate()-1);
			d3=f3.getDate();
			if (d3==30) dias -=1;
			if (d3==29) dias -=2;
			if (d3==28) dias -=3;
		}
	}

	return {ans:ans,meses:meses,dias:dias,Tdias:totdias};
}

Última edición por zerokilled; 15/11/2012 a las 19:13 Razón: aplicando bbcode al codigo
  #2 (permalink)  
Antiguo 15/11/2012, 19:21
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Diferencia entre dos fechas en años, meses y días

¡buenas y bienvenido!

primero comentar que, por favor, al publicar código aplicale formato con bbcode para códigos. pues estos facilitan la lectura. respecto a tu tema, honestamente me sorprende que conoces algunos de los métodos del objeto Math, pero no me explico como no pudistes ver Math.min y Math.max. justamente hacen lo que quieres hacer al ubicar un valor en una variable específica.

Código:
var mayor = Math.max(fecha1, fecha2);
var menor = Math.min(fecha1, fecha2);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 17/11/2012, 03:30
 
Fecha de Ingreso: agosto-2012
Ubicación: Madrid
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Diferencia entre dos fechas en años, meses y días

En primer lugar gracias por tomarte la molestia de contestar
Entiendo te refieres a usar

Código:
var f2 = Math.max(fa, fb);
var f1 = Math.min(fa, fb);
en vez de:
Código:
var f2=new Date();	var f1=new Date();
if (fa > fb){f2=fa;f1=fb;}else{f2=fb; f1=fa;}  //Siempre f2 > f1
Soy nuevo en programación y autodidacta, cuando desarrolle está función use el código que propones y no funcionaba. Lo resolví como he publicado.

Ahora ya se porqué y que pasando números a fechas si funciona:
Código:
var f2 =new Date( Math.max(fa, fb) );
var f1 =new Date( Math.min(fa, fb) );
Más sencillo y elegante.
Por cierto se puede cambiar el código del mensaje inicial. o debo re-publicarlo.
Abusando de tu paciencia y tu tiempo. ¿Tiene algún valor esta función? ¿Conoces una función similar?.
Repito muchísimas gracias
  #4 (permalink)  
Antiguo 17/11/2012, 16:22
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Diferencia entre dos fechas en años, meses y días

Cita:
¿Tiene algún valor esta función? ¿Conoces una función similar?.
no estoy seguro en qué sentido te refieres, pero si, tiene su uso. Math.min te devuelve el valor mínimo dentro de varios valores. lo mismo hace Math.max pero con el valor máximo. en tu caso quizas no funcionó por algún error que cometiste. ¿una función similar a qué? ¿a poner un valor en una variable y otro valor en otra variable automaticamente? no, no hay función nativa que realice eso, pero tu mismo podrías definir tu propia versión.

Cita:
Por cierto se puede cambiar el código del mensaje inicial. o debo re-publicarlo.
una vez pierdes la oportunidad (normalmente después que alguien responde después de ti), ya no puedes hacerlo. si quieres publicarlo nuevamente porque hicistes algún cambio en el código, puedes hacerlo.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 18/11/2012, 07:03
 
Fecha de Ingreso: agosto-2012
Ubicación: Madrid
Mensajes: 5
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Diferencia entre dos fechas en años, meses y días

Hola zerokilled:

Una vez mas gracias por la pronta respuesta.

Con las preguntas me refería a si hallar la diferencia de fechas en años meses y días es algo muy manido o si lo ves útil para foro, nada mas lejos de hacer perder el tiempo a los foreros con cosas que no tengan validez práctica o ya estén muy trilladas .

El error inicial era usar "var f2 = Math.max(fa, fb);" con lo que f2 era de tipo numérico y no una fecha. Gracias a ti he vuelto al problema y se arregla con "var f2 =new Date( Math.max(fa, fb) )" y así f2 sí es una fecha.

Bien, la publicare de nuevo.

Etiquetas: diferencia, meses
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:20.