Foros del Web » Programando para Internet » Javascript »

Restar Fechas y sumar dias en Javascript

Estas en el tema de Restar Fechas y sumar dias en Javascript en el foro de Javascript en Foros del Web. Hola-.... Ando un poco cansado de buscar en Internet soluciones que puedan ayudar a restar dos fechas. Las fechas las tomo de un calendario que ...
  #1 (permalink)  
Antiguo 14/03/2011, 11:52
Avatar de gabrican  
Fecha de Ingreso: junio-2008
Ubicación: Medellin
Mensajes: 89
Antigüedad: 14 años, 7 meses
Puntos: 4
Pregunta Restar Fechas y sumar dias en Javascript

Hola-....

Ando un poco cansado de buscar en Internet soluciones que puedan ayudar a restar dos fechas.

Las fechas las tomo de un calendario que me entrega en formato DD/MM/AAAA.
Intenté con Date(), pero no las toma como fecha y en cambio me pone la fecha actual...

Lo que debo hacer es: Restar dos fechas X y Y, luego el resultado de esas dos fechas debo sumarla a otra fecha Z.

Es decir (11/03/2011 - 01/03/2011) = 10 Dias
Luego, 14/03/2011 + 10 Dias = 24/03/2011

Alguien me podría ayudar con un script o algo???
__________________
Gabo Duk3
I.S
  #2 (permalink)  
Antiguo 14/03/2011, 12:45
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 11 años, 10 meses
Puntos: 192
Respuesta: Restar Fechas y sumar dias en Javascript

Es todo un asunto la aritmética con fechas :)
Yo había solucionado un asunto parecido alguna vez en AutoIt (un lenguaje sencillo de scripting para windows). Lo que hice fue usar funciones ya incluidas en el lenguaje que permitían convertir una fecha determinada a lo que se llama Fecha Juliana, que luego era sencillo de operar y re-convertir a formato de fecha.

Otro método es tomar una fecha como referencia y calcular el número de días transcurridos desde entonces a las dos fechas con las cuales quieres operar y luego operar con estos números normalmente.

Bueno yo hice en C hace un tiempo para la facultad unas funciones que calculan la diferencia de dos fechas con mucha presición. Lo más importante en el código es la función FechaADias(), que lo que hace es obtener el número de días desde el 1/01/1904. Luego con FechaDif() se puede calcular la diferencia en días entre esas dos fechas.

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. struct fecha{
  4.     int dia;
  5.     int mes;
  6.     int anio;
  7. };
  8.  
  9. long FechaDif(int , int, int, int, int, int);
  10. long FechaADias(int, int, int);
  11.  
  12. void main()
  13. {
  14.     struct fecha ingreso, alta;
  15.     long dif;
  16.    
  17.     printf("\nIngrese 1° fecha [dia mes año]:");
  18.     scanf("%d %d %d",&ingreso.dia,&ingreso.mes,&ingreso.anio);
  19.     printf("\nIngrese 2° fecha [dia mes año]:");
  20.     scanf("%d %d %d",&alta.dia,&alta.mes,&alta.anio);
  21.    
  22.     dif = FechaDif(ingreso.dia,ingreso.mes,ingreso.anio,
  23.                 alta.dia,alta.mes,alta.anio);
  24.     printf("\n%ld dias de diferencia.",dif);
  25. }
  26.  
  27. long FechaDif(int dia1, int mes1, int anio1, int dia2, int mes2, int anio2)
  28. {
  29.     /* Meses con 31:
  30.         Enero(1) Marzo(3) Mayo(5) Julio(7) Agosto(8) Octubre(10) Diciembre(12)
  31.        
  32.         Meses con 30:
  33.         Abril(4) Junio(6) Setiembre(9) Noviembre(11)
  34.        
  35.         Meses con 28:
  36.         Febrero(2)
  37.     */
  38.     long dias1,dias2,dif;
  39.     printf("\n\n%d %d %d\n\n",dia1,mes1,anio1);
  40.     printf("\n\n%d %d %d\n\n",dia2,mes2,anio2);
  41.    
  42.     //Chequear valores.
  43.     if((mes1>12)|(mes2>12))
  44.         return -1;
  45.    
  46.     if((mes1==1)|(mes1==3)|(mes1==5)|(mes1==7)|(mes1==8)|(mes1==10)|(mes1==12))
  47.         if(dia1>31)
  48.             return -1;
  49.     if((mes2==1)|(mes2==3)|(mes2==5)|(mes2==7)|(mes2==8)|(mes2==10)|(mes2==12))
  50.         if(dia2>31)
  51.             return -1;
  52.     if((mes1==4)|(mes1==6)|(mes1==9)|(mes1==11))
  53.         if(dia1>30)
  54.             return -1;
  55.     if((mes2==4)|(mes2==6)|(mes2==9)|(mes2==11))
  56.         if(dia2>30)
  57.             return -1;
  58.     if(mes1==2 && dia1>29)
  59.             return -1;
  60.     if(mes2==2 && dia2>29)
  61.             return -1;
  62.    
  63.     dias1 = FechaADias(dia1,mes1,anio1);
  64.     dias2 = FechaADias(dia2,mes2,anio2);
  65.     //devolver la diferencia positiva
  66.     dif = dias2 - dias1;
  67.     if(dif<0)
  68.         return ((long)(-1*dif));
  69.     return dif;
  70. }
  71.  
  72.  
  73. long FechaADias(int dia, int mes, int anno){
  74.     /*Devuelve la cantidad de días desde el 1/01/1904
  75.     No verifica datos. Llamada desde FechaDif()
  76.     intervalo permitido: 1904-2099
  77.      */
  78.    
  79.     long cant_bic,cant_annos,cant_dias;
  80.     int no_es_bic;
  81.  
  82.    
  83.     //verificar la cantidad de biciestos en el periodo (div entera)
  84.     //+1 p/contar 1904
  85.     cant_bic = (anno-1904)/4 + 1;
  86.     no_es_bic = anno%4;
  87.     //calcular dias transcurridos hasta el 31 de dic del año anterior
  88.     cant_annos = anno-1904;
  89.     cant_dias = cant_annos*365 + cant_bic;
  90.    
  91.     //calcular dias transcurridoes desde el 31 de dic del año anterior
  92.     //hasta el mes anterior al ingresado
  93.     int i;
  94.     for(i=1;i<mes;i++){
  95.         if((i==1)|(i==3)|(i==5)|(i==7)|(i==8)|(i==10)|(i==12))
  96.             cant_dias+=31;
  97.         if((i==4)|(i==6)|(i==9)|(i==11))
  98.             cant_dias+=30;
  99.         if(i==2)
  100.             {
  101.             if(no_es_bic)
  102.                 cant_dias+=28;
  103.             else
  104.                 cant_dias+=29;
  105.         }
  106.     }  
  107.     //sumarle los dias transcurridos en el mes
  108.     cant_dias+=dia;
  109.     return cant_dias;
  110. }

La función FechaDif() devuelve -1 si hay algún error. Es fácil convertir a JavaScript. Si realmente no podés me puedo tomar unos minutos y hacerlo por vos.

Ojo que el código tiene copyright, me costó mucho trabajo en ese momento! ;)

Última edición por Naahuel; 14/03/2011 a las 12:54 Razón: Error de ortografía :P
  #3 (permalink)  
Antiguo 14/03/2011, 14:32
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 11 años, 10 meses
Puntos: 192
Respuesta: Restar Fechas y sumar dias en Javascript

Bueno pues de aburrido y porque me pareció interesante, lo convertí yo:
Código HTML:
<!DOCTYPE html> 
<head> 
	<script src="http://jqueryui.com/jquery-1.4.4.js"></script> 
	<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.js"></script> 
	<script src="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/jquery.ui.datepicker-es.js"></script> 
	<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.3/themes/base/jquery-ui.css"> 
	<script type="text/javascript"> 
	$(function() {
		//incluir datepicker, solo para molestar :P 
		$( ".datepicker" ).datepicker();
		
		
		//calculo de la diferencia
		$('#calcular').click(function(){
			var fecha_1 = $('#fecha_1').val().split('/');
			var fecha_2 = $('#fecha_2').val().split('/');
			//calcular la diferencia
			var dif = FechaDif(fecha_1[0], fecha_1[1], fecha_1[2],
								fecha_2[0], fecha_2[1], fecha_2[2]);
			//mostrar la diferencia
			$('#diferencia').val(dif + ' dias de diferencia');
		});
		
		//funciones
		function FechaDif(dia1,mes1,anio1,dia2,mes2,anio2)
		{
		*	/* Meses con 31:
		*	*	Enero(1) Marzo(3) Mayo(5) Julio(7) Agosto(8) Octubre(10) Diciembre(12)
		*	*	
		*	*	Meses con 30:
		*	*	Abril(4) Junio(6) Setiembre(9) Noviembre(11)
		*	*	
		*	*	Meses con 28:
		*	*	Febrero(2)
		*	*/
		*	var dias1,dias2,dif;
		*	//convertir a numeros
			dia1 = parseInt(dia1,10);
			mes1 = parseInt(mes1,10);
			anio1 = parseInt(anio1,10);
			dia2 = parseInt(dia2,10);
			mes2 = parseInt(mes2,10);
			anio2 = parseInt(anio2,10);
			
		*	//Chequear valores.
		*	if((mes1>12)||(mes2>12)){ return -1;}
		*	
		*	if((mes1==1)||(mes1==3)||(mes1==5)||(mes1==7)||(mes1==8)||(mes1==10)||(mes1==12)){
		*	*	if(dia1>31){
		*	*	*	return -1;}
			}
		*	if((mes2==1)||(mes2==3)||(mes2==5)||(mes2==7)||(mes2==8)||(mes2==10)||(mes2==12)){
		*	*	if(dia2>31){
		*	*	*	return -1;}
			}
		*	if((mes1==4)||(mes1==6)||(mes1==9)||(mes1==11)){
		*	*	if(dia1>30){
		*	*	*	return -1;}
			}
		*	if((mes2==4)||(mes2==6)||(mes2==9)||(mes2==11)){
		*	*	if(dia2>30){
		*	*	*	return -1;}
			}
		*	if(mes1==2 && dia1>29){
		*	*	*	return -1;}
		*	if(mes2==2 && dia2>29){
		*	*	*	return -1;}
		*	
		*	dias1 = FechaADias(dia1,mes1,anio1);
		*	dias2 = FechaADias(dia2,mes2,anio2);
		*	//devolver la diferencia positiva
		*	dif = dias2 - dias1;
		*	if(dif<0){
		*	*	return ((-1*dif));}
		*	return dif;
		}
		
		function FechaADias(dia, mes, anno){
		*/*Devuelve la cantidad de días desde el 1/01/1904
		*	No verifica datos. Llamada desde FechaDif()
		*	intervalo permitido: 1904-2099
		*	**/
		*	
			dia = parseInt(dia,10);
			mes = parseInt(mes,10);
			anno = parseInt(anno,10);
		*	var cant_bic,cant_annos,cant_dias, no_es_bic;
		*
		*	
		*	//verificar la cantidad de biciestos en el periodo (div entera)
		*	//+1 p/contar 1904
		*	cant_bic = parseInt((anno-1904)/4 + 1);
		*	no_es_bic = parseInt((anno % 4));
		*	//calcular dias transcurridos hasta el 31 de dic del año anterior
		*	cant_annos = parseInt(anno-1904);
		*	cant_dias = parseInt(cant_annos*365 + cant_bic);
		*	
		*	//calcular dias transcurridoes desde el 31 de dic del año anterior
		*	//hasta el mes anterior al ingresado
		*	var i;
		*	for(i=1;i<=mes;i++){
		*	*	if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)||(i==12)){
		*	*	*	cant_dias+=31;}
		*	*	if((i==4)||(i==6)||(i==9)||(i==11)){
		*	*	*	cant_dias+=30;}
		*	*	if(i==2)
		*	*	*	{
		*	*	*	if(no_es_bic){
		*	*	*	*	cant_dias+=28;}
		*	*	*	else{
		*	*	*	*	cant_dias+=29;}
		*	*	}
		*	}	
		*	//sumarle los dias transcurridos en el mes
		*	cant_dias+=dia;
		*	return cant_dias;
		}
	});
	</script> 
</head> 
<body> 
 
<p>Fecha 1: <input type="text" id="fecha_1" class="datepicker"></p> 
<p>Fecha 2: <input type="text" id="fecha_2" class="datepicker"></p> 
<p>Diferencia en dias: <input type="text" id="diferencia" disabled="disabled"></p> 
<p><button id="calcular">Calcular</button></p>

 
</body> 
Espero se entienda. Acá podés verlo en funcionamiento:
http://jsbin.com/imodi3 <- Acá podés ver el código si vas a "Edit using JS Bin"- No puedo sacar las estrellitas de acá :P

Saludos!

Última edición por Naahuel; 14/03/2011 a las 14:46 Razón: Sale mal el url
  #4 (permalink)  
Antiguo 14/03/2011, 15:02
Avatar de gabrican  
Fecha de Ingreso: junio-2008
Ubicación: Medellin
Mensajes: 89
Antigüedad: 14 años, 7 meses
Puntos: 4
Respuesta: Restar Fechas y sumar dias en Javascript

Cita:
Iniciado por Naahuel Ver Mensaje
Es todo un asunto la aritmética con fechas :)
Yo había solucionado un asunto parecido alguna vez en AutoIt (un lenguaje sencillo de scripting para windows). Lo que hice fue usar funciones ya incluidas en el lenguaje que permitían convertir una fecha determinada a lo que se llama Fecha Juliana, que luego era sencillo de operar y re-convertir a formato de fecha.

Otro método es tomar una fecha como referencia y calcular el número de días transcurridos desde entonces a las dos fechas con las cuales quieres operar y luego operar con estos números normalmente.

Bueno yo hice en C hace un tiempo para la facultad unas funciones que calculan la diferencia de dos fechas con mucha presición. Lo más importante en el código es la función FechaADias(), que lo que hace es obtener el número de días desde el 1/01/1904. Luego con FechaDif() se puede calcular la diferencia en días entre esas dos fechas.

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. struct fecha{
  4.     int dia;
  5.     int mes;
  6.     int anio;
  7. };
  8.  
  9. long FechaDif(int , int, int, int, int, int);
  10. long FechaADias(int, int, int);
  11.  
  12. void main()
  13. {
  14.     struct fecha ingreso, alta;
  15.     long dif;
  16.    
  17.     printf("\nIngrese 1° fecha [dia mes año]:");
  18.     scanf("%d %d %d",&ingreso.dia,&ingreso.mes,&ingreso.anio);
  19.     printf("\nIngrese 2° fecha [dia mes año]:");
  20.     scanf("%d %d %d",&alta.dia,&alta.mes,&alta.anio);
  21.    
  22.     dif = FechaDif(ingreso.dia,ingreso.mes,ingreso.anio,
  23.                 alta.dia,alta.mes,alta.anio);
  24.     printf("\n%ld dias de diferencia.",dif);
  25. }
  26.  
  27. long FechaDif(int dia1, int mes1, int anio1, int dia2, int mes2, int anio2)
  28. {
  29.     /* Meses con 31:
  30.         Enero(1) Marzo(3) Mayo(5) Julio(7) Agosto(8) Octubre(10) Diciembre(12)
  31.        
  32.         Meses con 30:
  33.         Abril(4) Junio(6) Setiembre(9) Noviembre(11)
  34.        
  35.         Meses con 28:
  36.         Febrero(2)
  37.     */
  38.     long dias1,dias2,dif;
  39.     printf("\n\n%d %d %d\n\n",dia1,mes1,anio1);
  40.     printf("\n\n%d %d %d\n\n",dia2,mes2,anio2);
  41.    
  42.     //Chequear valores.
  43.     if((mes1>12)|(mes2>12))
  44.         return -1;
  45.    
  46.     if((mes1==1)|(mes1==3)|(mes1==5)|(mes1==7)|(mes1==8)|(mes1==10)|(mes1==12))
  47.         if(dia1>31)
  48.             return -1;
  49.     if((mes2==1)|(mes2==3)|(mes2==5)|(mes2==7)|(mes2==8)|(mes2==10)|(mes2==12))
  50.         if(dia2>31)
  51.             return -1;
  52.     if((mes1==4)|(mes1==6)|(mes1==9)|(mes1==11))
  53.         if(dia1>30)
  54.             return -1;
  55.     if((mes2==4)|(mes2==6)|(mes2==9)|(mes2==11))
  56.         if(dia2>30)
  57.             return -1;
  58.     if(mes1==2 && dia1>29)
  59.             return -1;
  60.     if(mes2==2 && dia2>29)
  61.             return -1;
  62.    
  63.     dias1 = FechaADias(dia1,mes1,anio1);
  64.     dias2 = FechaADias(dia2,mes2,anio2);
  65.     //devolver la diferencia positiva
  66.     dif = dias2 - dias1;
  67.     if(dif<0)
  68.         return ((long)(-1*dif));
  69.     return dif;
  70. }
  71.  
  72.  
  73. long FechaADias(int dia, int mes, int anno){
  74.     /*Devuelve la cantidad de días desde el 1/01/1904
  75.     No verifica datos. Llamada desde FechaDif()
  76.     intervalo permitido: 1904-2099
  77.      */
  78.    
  79.     long cant_bic,cant_annos,cant_dias;
  80.     int no_es_bic;
  81.  
  82.    
  83.     //verificar la cantidad de biciestos en el periodo (div entera)
  84.     //+1 p/contar 1904
  85.     cant_bic = (anno-1904)/4 + 1;
  86.     no_es_bic = anno%4;
  87.     //calcular dias transcurridos hasta el 31 de dic del año anterior
  88.     cant_annos = anno-1904;
  89.     cant_dias = cant_annos*365 + cant_bic;
  90.    
  91.     //calcular dias transcurridoes desde el 31 de dic del año anterior
  92.     //hasta el mes anterior al ingresado
  93.     int i;
  94.     for(i=1;i<mes;i++){
  95.         if((i==1)|(i==3)|(i==5)|(i==7)|(i==8)|(i==10)|(i==12))
  96.             cant_dias+=31;
  97.         if((i==4)|(i==6)|(i==9)|(i==11))
  98.             cant_dias+=30;
  99.         if(i==2)
  100.             {
  101.             if(no_es_bic)
  102.                 cant_dias+=28;
  103.             else
  104.                 cant_dias+=29;
  105.         }
  106.     }  
  107.     //sumarle los dias transcurridos en el mes
  108.     cant_dias+=dia;
  109.     return cant_dias;
  110. }

La función FechaDif() devuelve -1 si hay algún error. Es fácil convertir a JavaScript. Si realmente no podés me puedo tomar unos minutos y hacerlo por vos.

Ojo que el código tiene copyright, me costó mucho trabajo en ese momento! ;)
Hola... antes que todo... 20.000 gracias por responder... sería excelente que me pudieras colaborar con el cod en Javascript, aunque en este momento ya llevo algo adelantado.

Como te dije que tomo los datos desde un text en formato DD/MM/AAAA, ya pude separar dias, meses y años, lo que no he podido es asignarlos a la variable para restarlo... algo mas ilustrativo:
Código:
var fechaIni = new Date();
fechaIni.setFullYear(year0, month0, day0)
		
var fechaFin = new Date();
fechaFin.setFullYear(year1, month1, day1)
En donde:
year0, month0, day0 son los datos de la fecha inicial
year1, month1, day1 son los datos de la fecha final

Cuando hago la asignacion "var fechaIni = NewDate();" lo que hace es tomarme la fecha actual y cuando "seteo" los valores por fechaIni.setFullYear no me pegan los datos!!!!

Me podes ayudar... sea con esta solucion o "traduciendo" lo que vos tenes'???

Te lo agradeceria muchisisimo bro
__________________
Gabo Duk3
I.S
  #5 (permalink)  
Antiguo 14/03/2011, 15:07
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 11 años, 10 meses
Puntos: 192
Respuesta: Restar Fechas y sumar dias en Javascript

Pues ya lo hice :P
Aquí podés verlo en funcionamiento:
http://jsbin.com/imodi3

Arriba a la derecha aparece un botón para editar, donde podés ver el código fuente. Lo único necesario para obtener la diferencia en días entre dos fechas es:

var dif = FechaDif(dia1,mes1,año1, dia2,mes2,año2);

Etiquetas: dias, fechas, restar
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

SíEste tema le ha gustado a 2 personas




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