Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/03/2011, 15:02
Avatar de gabrican
gabrican
 
Fecha de Ingreso: junio-2008
Ubicación: Medellin
Mensajes: 89
Antigüedad: 16 años, 6 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