Ver Mensaje Individual
  #2 (permalink)  
Antiguo 14/03/2011, 12:45
Avatar de Naahuel
Naahuel
 
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 13 años, 8 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