Foros del Web » Programando para Internet » Javascript »

Un error en las Faqs de Javascript de Kaopectate, o almenos eso creo

Estas en el tema de Un error en las Faqs de Javascript de Kaopectate, o almenos eso creo en el foro de Javascript en Foros del Web. Estoy buscando un restador de fechas exacto para mi web (hacerlo inexacto es sencillo el problema es que no tiene en cuenta los dias de ...
  #1 (permalink)  
Antiguo 20/04/2006, 14:40
 
Fecha de Ingreso: noviembre-2002
Mensajes: 59
Antigüedad: 21 años, 5 meses
Puntos: 0
Un error en las Faqs de Javascript de Kaopectate, o almenos eso creo

Estoy buscando un restador de fechas exacto para mi web (hacerlo inexacto es sencillo el problema es que no tiene en cuenta los dias de un mes, ni si es bisiesto, ni nada de nada...) en que hay en las faqs es genial (gracias por el aporte), pero tiene un fallo grande, que es el siguiente. Si ponemos que nos reste la fecha de 01/02/2006 a 01/03/2006 el resultado es 0, alguien sabe por qué.

La faq en cuestion esta en:
http://www.forosdelweb.com/showthrea...808#post375808

y el código de la misma es:
Código PHP:
<?php BEGIN__VBULLETIN__CODE__SNIPPET 

<html
 <
head
  <
script language="JavaScript"
   function 
cerosIzq(sValnPos){ 
    var 
sRes sVal
    for (var 
sVal.lengthnPosi++) 
     
sRes "0" sRes
    return 
sRes
   } 

   function 
armaFecha(nDianMesnAno){ 
    var 
sRes cerosIzq(String(nDia), 2); 
    
sRes sRes "/" cerosIzq(String(nMes), 2); 
    
sRes sRes "/" cerosIzq(String(nAno), 4); 
    return 
sRes
   } 

   function 
sumaMes(nDianMesnAnonSum){ 
    if (
nSum >= 0){ 
     for (var 
0Math.abs(nSum); i++){ 
      if (
nMes == 12){ 
       
nMes 1
       
nAno += 1
      } else 
nMes += 1
     } 
    } else { 
     for (var 
0Math.abs(nSum); i++){ 
      if (
nMes == 1){ 
       
nMes 12
       
nAno -= 1
      } else 
nMes -= 1
     } 
    } 
    return 
armaFecha(nDianMesnAno); 
   } 

   function 
esBisiesto(nAno){ 
    var 
bRes true
    
res bRes && (nAno == 0); 
    
res bRes && (nAno 100 != 0); 
    
res bRes || (nAno 400 == 0); 
    return 
bRes
   } 

   function 
finMes(nMesnAno){ 
    var 
nRes 0
    switch (
nMes){ 
     case 
1nRes 31; break; 
     case 
2nRes 28; break; 
     case 
3nRes 31; break; 
     case 
4nRes 30; break; 
     case 
5nRes 31; break; 
     case 
6nRes 30; break; 
     case 
7nRes 31; break; 
     case 
8nRes 31; break; 
     case 
9nRes 30; break; 
     case 
10nRes 31; break; 
     case 
11nRes 30; break; 
     case 
12nRes 31; break; 
    } 
    return 
nRes + (((nMes == 2) && esBisiesto(nAno))? 10); 
   } 

   function 
diasDelAno(nAno){ 
    var 
nRes 365
    if (
esBisiesto(nAno)) nRes++; 
    return 
nRes
   } 

   function 
anosEntre(nDi0nMe0nAn0nDi1nMe1nAn1){ 
    var 
nRes Math.max(0nAn1 nAn0 1); 
    if (
nAn1 != nAn0
     if ((
nMe1 nMe0) || ((nMe1 == nMe0) && (nDi1 >= nDi0))) 
      
nRes++; 
    return 
nRes
   } 

   function 
mesesEntre(nDi0nMe0nAn0nDi1nMe1nAn1){ 
    var 
nRes
    if ((
nMe1 nMe0) || ((nMe1 == nMe0) && (nDi1 nDi0))) nMe1 += 12
    
nRes Math.max(0nMe1 nMe0 1); 
    if ((
nDi1 nDi0) && (nMe1 != nMe0)) nRes++; 
    return 
nRes
   } 

   function 
diasEntre(nDi0nMe0nAn0nDi1nMe1nAn1){ 
    var 
nRes
    if (
nDi1 nDi0nDi1 += finMes(nMe0nAn0); 
    
nRes Math.max(0nDi1 nDi0); 
    return 
nRes
   } 

   function 
mayorOIgual(nDi0nMe0nAn0nDi1nMe1nAn1){ 
    var 
bRes false
    
bRes bRes || (nAn1 nAn0); 
    
bRes bRes || ((nAn1 == nAn0) && (nMe1 nMe0)); 
    
bRes bRes || ((nAn1 == nAn0) && (nMe1 == nMe0) && (nDi1 >= nDi0)); 
    return 
bRes
   } 

   function 
calcula(){ 
    var 
sFc0 document.frm.fecha0.value// Se asume válida 
    
var sFc1 document.frm.fecha1.value// Se asume válida 
    
var nDi0 parseInt(sFc0.substr(02), 10); 
    var 
nMe0 parseInt(sFc0.substr(32), 10); 
    var 
nAn0 parseInt(sFc0.substr(64), 10); 
    var 
nDi1 parseInt(sFc1.substr(02), 10); 
    var 
nMe1 parseInt(sFc1.substr(32), 10); 
    var 
nAn1 parseInt(sFc1.substr(64), 10); 
    if (
mayorOIgual(nDi0nMe0nAn0nDi1nMe1nAn1)){ 
     var 
nAno anosEntre(nDi0nMe0nAn0nDi1nMe1nAn1); 
     var 
nMes mesesEntre(nDi0nMe0nAn0nDi1nMe1nAn1); 
     var 
nDia diasEntre(nDi0nMe0nAn0nDi1nMe1nAn1); 
     var 
nTtM nAno 12 nMes
     var 
nTtD nDia
     for (var 
nAn0nAn0 nAnoi++) nTtD += diasDelAno(nAno); 
     for (var 
nMe0nMe0 nMesj++) nTtD += finMes(jnAn1); 
     var 
nTSS Math.floor(nTtD 7); 
     var 
nTSD nTtD 7
     
document.frm.difDMA.value String(nAno) + " años, " String(nMes) + " meses, " String(nDia) + " días"
     
document.frm.difDM.value String(nTtM) + " meses, " String(nDia) + " días"
     
document.frm.difD.value String(nTtD) + " días"
     
document.frm.difSD.value String(nTSS) + " semanas, " String(nTSD) + " días"
    } else 
alert("Error en rango"); 
   } 
  
</script> 
 </head> 
 <body> 
  <form name="frm"> 
   <table border="0"> 
    <tr> 
     <td> 
      <table border="1"> 
       <tr> 
        <td align="right"> 
         Fecha inicial (dd/mm/aaaa) 
        </td> 
        <td> 
         <input type="text" name="fecha0" value="31/08/1996"> 
        </td> 
       </tr> 
       <tr> 
        <td align="right"> 
         Fecha final (dd/mm/aaaa) 
        </td> 
        <td> 
         <input type="text" name="fecha1" value="09/07/1999"> 
        </td> 
       </tr> 
       <tr> 
        <td align="right"> 
         Diferencia (D,M,A) 
        </td> 
        <td> 
         <input type="text" name="difDMA" readonly> 
        </td> 
       </tr> 
       <tr> 
        <td align="right"> 
         Diferencia (D,M) 
        </td> 
        <td> 
         <input type="text" name="difDM" readonly> 
        </td> 
       </tr> 
       <tr> 
        <td align="right"> 
         Diferencia (D) 
        </td> 
        <td> 
         <input type="text" name="difD" readonly> 
        </td> 
       </tr> 
       <tr> 
        <td align="right"> 
         Diferencia (SD) 
        </td> 
        <td> 
         <input type="text" name="difSD" readonly> 
        </td> 
       </tr> 
      </table> 
     </td> 
    </tr> 
    <tr> 
     <td align="center"> 
      <input type="button" value="Calcular" onclick="calcula()"> 
     </td> 
    </tr> 
   </table> 
  </form> 
 </body> 
</html>

Si alguien sabe algo agradecido estoy. Un saludo Jonai

Última edición por jonai; 20/04/2006 a las 16:19
  #2 (permalink)  
Antiguo 20/04/2006, 16:18
 
Fecha de Ingreso: noviembre-2002
Mensajes: 59
Antigüedad: 21 años, 5 meses
Puntos: 0
Una posible solución

Aunque poco elegante la posible solución que doy es las de cambiar:

Código PHP:

   
function diasEntre(nDi0nMe0nAn0nDi1nMe1nAn1){  
    var 
nRes;  
    if (
nDi1 nDi0nDi1 += finMes(nMe0nAn0);  
    
nRes Math.max(0nDi1 nDi0);  
    return 
nRes;  
   } 
Por
Código PHP:

  
function diasEntre(nDi0nMe0nAn0nDi1nMe1nAn1){ 
    var 
nRes
    
nDi1 nDi1-1
    
if (nDi1 nDi0nDi1 += finMes(nMe0nAn0); 
    
nRes Math.max(0nDi1 nDi0) + 1

    return 
nRes
   } 
Un saludo Jonai
  #3 (permalink)  
Antiguo 20/04/2006, 16:30
 
Fecha de Ingreso: noviembre-2002
Mensajes: 59
Antigüedad: 21 años, 5 meses
Puntos: 0
La solución anterior no sirve

Pues eso, no sirve ya que ahora cuando marco la misma fecha dos veces, por ejemplo:
01/03/2006 y 01/03/2006 me cuenta 31 días

jejeje seguiré buscando pero si a alguien se le ocurre algo sera bienvenido.

Un saludo Jonai
  #4 (permalink)  
Antiguo 20/04/2006, 16:50
 
Fecha de Ingreso: noviembre-2002
Mensajes: 59
Antigüedad: 21 años, 5 meses
Puntos: 0
Esta vez parece que funciona

Sigue sin ser elegante pero esta vez parece que funciona:

Código PHP:
   function diasEntre(nDi0nMe0nAn0nDi1nMe1nAn1){  
    var 
nRes;  
if (
nMe0 != nMe1){
    
nDi1 nDi1-
    
if (nDi1 nDi0nDi1 += finMes(nMe0nAn0);  
    
nRes Math.max(0nDi1 nDi0) + 1;  
    return 
nRes;  
   }  
else {
    if (
nDi1 nDi0nDi1 += finMes(nMe0nAn0);  
    
nRes Math.max(0nDi1 nDi0);  
    return 
nRes;  
   }    

Un saludo Jonai
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 17:08.