Foros del Web » Programando para Internet » Javascript »

Problemas con los años bisiestos en JavaScript

Estas en el tema de Problemas con los años bisiestos en JavaScript en el foro de Javascript en Foros del Web. Hola. He creado una funcion para calcular la edad de una persona, pero las fechas son incorrectas por no tomar en cuenta los años bisiestos. ...
  #1 (permalink)  
Antiguo 01/07/2008, 11:59
 
Fecha de Ingreso: agosto-2006
Mensajes: 24
Antigüedad: 17 años, 8 meses
Puntos: 1
Problemas con los años bisiestos en JavaScript

Hola.
He creado una funcion para calcular la edad de una persona, pero las fechas son incorrectas por no tomar en cuenta los años bisiestos. Y tengo 2 funciones para saber los años bisiestos pero no se como aplicarlas.

Tengo una funcion para comprobar si el año es bisiesto.

unction añoBis(año) { // pero tampoco se como aplicarla
if ((año % 4 == 0) && (( año % 100 != 0) || (año % 400 ==0)))
return true;
else
return false;
}

Y otra para aplicarlas a al mes de febrero

dias_Mes = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
function getDays(month, año) {
if (Bisiesto(año))
dias_Mes[1]=29; // solo para Febrero
else
dias_Mes[1]=28;
return dias_Mes[mes]
}

Bueno estas son mis ideas que yo he cogido por ahi, pero claro pueden haber muchas mas.
Tambien he buscado en este fero, y he encontrado algo pero no entiendo, ya que para mi los codigos son demaciados extensos para entenerlos y aplicarolos para lo que yo estoy buscando.


Este es mi codigo de principiante:

<HTML>
<HEAD>
<TITLE>Mi Edad</TITLE>
<script language="javascript">

function diasonline(){

numDiaBis=0;
diaForm=document.form1.inputDia.value;
mesForm=document.form1.inputMes.value;
anoForm=document.form1.inputAno.value;

fecha= new Date();

fechaInicio = new Date(fecha.getFullYear(),fecha.getMonth()+1,fecha. getDate());
fechaHoy = new Date(anoForm,mesForm,diaForm)

misFechas = fechaInicio.getTime() - fechaHoy.getTime();


dias = Math.floor(misFechas/(1000*60*60*24)); // no vele;
años=Math.floor(dias/365); // No vele;
meses = Math.floor(años/12) // Tampoco vele;

document.getElementById("myEdad").innerHTML=años+ " años" + "<br>" + meses +" Meses" + "<br>" + dias+ " dias ";
}

</script>
</HEAD>

<BODY BGCOLOR="#FFFFFF">
<form name="form1">
Dia <input type="text" size="2" name="inputDia" />
Mes <input type="text" size="2" name="inputMes" />
Año <input type="text" size="4" name="inputAno" />
<input type="button" value="Mi Edad" onClick="diasonline()" />
</form>
<div id="myEdad"></div>
</BODY>
</HTML>

Saludos.

Gracias.
  #2 (permalink)  
Antiguo 01/07/2008, 12:24
 
Fecha de Ingreso: diciembre-2005
Mensajes: 122
Antigüedad: 18 años, 4 meses
Puntos: 0
Respuesta: Problemas con los años bisiestos en JavaScript

me parece que te estas complicando demasiado. lo único que tenes que hacer es una resta entre el año actual y el del form y restar uno. luego, ver si la fecha de hoy es mayor a la del form, en caso afirmativo sumar 1 a la edad.
  #3 (permalink)  
Antiguo 01/07/2008, 13:13
 
Fecha de Ingreso: agosto-2006
Mensajes: 24
Antigüedad: 17 años, 8 meses
Puntos: 1
Respuesta: Problemas con los años bisiestos en JavaScript

Gracias plus_ultra

Pero el problema que tambien me gustaria saber las horas.
todo esto es para un trabajo que me han pedido, y para colmo los minutos jijiji pero bueno igualmente gracias.

Saludos
  #4 (permalink)  
Antiguo 01/07/2008, 18:43
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Problemas con los años bisiestos en JavaScript

Hola anje53:

Antes de nada he visto en portada otro mensaje tuyo casi idéntico (http://www.forosdelweb.com/f13/probl...iestos-601735/) que no sé si es la misma duda, pero deberíamos minimizar los post con las mismas dudas.

Revisa este mensaje que respondí hace poquito: http://www.forosdelweb.com/f13/resta...3/#post2465784, puede darte inspiración para restar fechas. Por otra parte recuerdo que en las FAQ hay un ejemplo para sacar la diferencia entre dos fechas.


Tengo entendido que las fechas en javascript sí tienen en cuenta los años y días bisiestos, tanto es así que en 2008 (año bisiesto) desde el 28 de febrero al 1 de marzo hay 2 días (28,29,1) y entre los mismos periodos del 2007 hay 1 día (28, 1). Compruébalo tú mismo en este script:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
title>Página nueva</title>
</
head>

<
body>

<
div id="myEdad"></div>


<
script type="text/javascript">
<!--


function 
sacarTiempo() {
    
window.setTimeout"sacarTiempo()"1000); 
    var 
fechaInicio = new Date(2008128); 
    var 
fechaFin = new Date(2008,2,1);
    var 
diferencia Math.absfechaFin.getTime() - fechaInicio.getTime() );
    var 
dias Math.floordiferencia /1000/60/60/24 );
    var 
horas Math.floordiferencia /1000/60/60) - dias*24;
    var 
minutos Math.floordiferencia /1000/60) - dias*24*60 horas*60;
    var 
segundos Math.floordiferencia /1000) - dias*24*60*60 horas*60*60 minutos*60;
    
document.getElementById('myEdad').innerHTML "Desde el "+fechaInicio+"<br/>Hasta "+fechaFin+": <br/>"+dias+"dias, "+horas+"horas, "+minutos+"minutos, "+segundos+"segundos.";


window.onload sacarTiempo;


// -->
</script>

</body>
</html> 
Y para ver el 2007 sólo tienes que cambiar las líneas de fechaInicio y fechaFin:
Código PHP:
    var fechaInicio = new Date(2007128); 
    var 
fechaFin = new Date(2007,2,1); 

Espero que te aclare.

Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 01/07/2008, 21:20
 
Fecha de Ingreso: agosto-2006
Mensajes: 24
Antigüedad: 17 años, 8 meses
Puntos: 1
Respuesta: Problemas con los años bisiestos en JavaScript

Tienes razon dekenuke he mandado el mismo mesaje por sin querer he incompleto, y mi problema es con los años bisiesestos
Los siento mucho a todos por doros faena por esto, pero en este ultimo ejemplo lo he modificado con fecha de inicio : var fechaInicio = new Date(1940, 1, 10);
y me da 25010 , mientras el windows me da: 25011.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<title>Página nueva</title>
</head>

<body>

<div id="myEdad"></div>


<script type="text/javascript">
<!--


function sacarTiempo() {
ahora= new Date();
window.setTimeout( "sacarTiempo()", 1000);
var fechaInicio = new Date(1940, 1, 10);
var fechaFin = new Date(ahora.getFullYear(),ahora.getMonth()+1,ahora. getDate());
var diferencia = Math.abs( fechaFin.getTime() - fechaInicio.getTime() );
var dias = Math.floor( diferencia /1000/60/60/24 );
var horas = Math.floor( diferencia /1000/60/60) - dias*24;
var minutos = Math.floor( diferencia /1000/60) - dias*24*60 - horas*60;
var segundos = Math.floor( diferencia /1000) - dias*24*60*60 - horas*60*60 - minutos*60;
document.getElementById('myEdad').innerHTML = "Desde el "+fechaInicio+"<br/>Hasta "+fechaFin+": <br/>"+dias+"dias,

"+horas+"horas, "+minutos+"minutos, "+segundos+"segundos.";
}

window.onload = sacarTiempo;


// -->
</script>

</body>
</html>
gracias
  #6 (permalink)  
Antiguo 01/07/2008, 21:34
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Problemas con los años bisiestos en JavaScript

Cita:
Iniciado por anje53 Ver Mensaje
este ultimo ejemplo lo he modificado con fecha de inicio : var fechaInicio = new Date(1940, 1, 10);
y me da 25010 , mientras el windows me da: 25011.
¿A qué te refieres con el windows me da: 25011? ¿Utilizas alguna aplicación para calcular diferencia entre fechas? Se podría hacer un cálculo un poco más manual (con algún bucle, contando día a día), pero así a ojo no se cuántos días hace que no es 1940...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 02/07/2008, 07:02
 
Fecha de Ingreso: agosto-2006
Mensajes: 24
Antigüedad: 17 años, 8 meses
Puntos: 1
Respuesta: Problemas con los años bisiestos en JavaScript

Antes que nada gracias derkenuke, y perdon por no explicarme bien. Pero he comparado el resultado del ejemplo que me has dado con un programa que de escritorio llamdo "Date and Time Calculator". y hay diferencia de un dia, he iniciado la fecha con var fechaInicio = new Date(1940, 1, 10); y me da "25010" (fecha de nacimiento de mi suegra jejeje) y con Date and Time Calculator me da 25011.

Saludos Gracias.
  #8 (permalink)  
Antiguo 02/07/2008, 09:01
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Problemas con los años bisiestos en JavaScript

Buf, pues no sé qué decirte, he metido los mismos parámetros que el javascript en http://www.timeanddate.com/ por ejemplo y me salen también 25.011 días (enlace). No sé muy bien a qué se puede deber, teniendo en cuenta que el 2008 sí lo cuenta como bisiesto...

Vamos a hacer un programita que cuente los días uno a uno con la misma configuración:
Código PHP:
Date.prototype.sumaUnDia = function() {
    
this.setTimethis.getTime() + (24*60*60*1000) );
}

Date.prototype.esElMismoDia = function( otraFecha ) {
    return (
this.getDate()===otraFecha.getDate()) && 
        (
this.getMonth()===otraFecha.getMonth()) && 
        (
this.getFullYear()===otraFecha.getFullYear());
}

var 
fechaInicio = new Date(1940110);
var 
fechaFin = new Date();                        //hoy
fechaFin.setMonthfechaFin.getMonth()+);        // es hoy más un mes
document.write("Entre: <br/>"+fechaInicio+" y <br/>"+fechaFin+"<br/>");

// le voy a sumar un día a la fechaInicio hasta que sea el mismo día fechaInicio que fechaFin
var diasContados 0;
while( 
fechaInicio.esElMismoDiafechaFin ) === false ) {
    
fechaInicio.sumaUnDia();
    
diasContados++;
}
document.write("He contado "+diasContados+" días, y ahora las fechas son:<br/>"+fechaInicio+" y <br/>"+fechaFin ); 
Y la salida es:
Cita:
Entre:
Sat Feb 10 00:00:00 UTC+0100 1940 y
Sat Aug 2 16:46:06 UTC+0200 2008
He contado 25011 días, y ahora las fechas son:
Sat Aug 2 01:00:00 UTC+0200 2008 y
Sat Aug 2 16:46:06 UTC+0200 2008
Así que bueno, no tengo ni la más remota idea de por qué contando poco a poco sale bien y contando a lo bestia mal, voy a revisar un poco el script de cálculo, debe andar algo mal por ahí, es lo más lógico.

A ver si lo sacamos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 02/07/2008, 09:15
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Problemas con los años bisiestos en JavaScript

Vale, creo que ya lo he sacado:

Mientras que en un script definimos una fecha con:
Código PHP:
var fechaFin = new Date(ahora.getFullYear(),ahora.getMonth()+1,ahoragetDate()); 
En el otro la definimos:
Código PHP:
var fechaFin = new Date(); fechaFin.setMonthfechaFin.getMonth()+); 
Creyendo que es lo mismo, pero no es lo mismo. En el primer caso la hora es las 00:00:00, y en el segundo caso la hora es la hora actual (por ejemplo 17:14:35).

En el primer caso la diferencia es de
Cita:
25010dias,23horas, 0minutos, 0segundos
Y en el segundo caso
Cita:
25011dias,16horas, 6minutos, 59segundos.
Se ve que en el primer caso no pasa a ser 25011 días y se queda en 25010 días por la diferencia de horas, 23, debida al cambio de horario (en febrero estamos en UTC+0100 y en Agosto estamos en UTC+0200, por aquello de adelantar y retrasar la hora).


Si te fijas en este resultado:
Cita:
Desde el Sat Feb 10 00:00:00 UTC+0100 1940
Hasta Sat Aug 2 17:09:13 UTC+0200 2008:
25011dias,16horas, 9minutos, 13segundos.
Se ve perfectamente que si no nos fijamos en el UTC la diferencia tendría que ser de 17 horas (17-0=17) pero es que estamos pasando de un horario UTC+2 a UTC+1, luego es 17-(0+1)=16 horas. Por eso no llega a completarse el día 25010º para ser 25011, por las horas.


Bueno, digo yo que será por eso, así lo he entendido yo. No tiene nada que ver con los años bisiestos, porque los años bisiestos los cuenta igual (desde 1940 a 2008 hay muchos años bisiestos, y la diferencia sería de muchos días, no de sólo uno).




Espero que con ésto te salga lo que estás intentando
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #10 (permalink)  
Antiguo 02/07/2008, 10:13
 
Fecha de Ingreso: agosto-2006
Mensajes: 24
Antigüedad: 17 años, 8 meses
Puntos: 1
Respuesta: Problemas con los años bisiestos en JavaScript

Ostia, eres un crack derkenuke.
Muchas gracias, bueno con las gracias no se si sea suficiente, no se como ss entregais a esto, y buscais y rebuscais en buestros conocimientos todo esto para unos desconocidos, pero bueno, si la manera es de pagaros es haciendo clicks en buestros anunciantes o visitando buestra pagina algunas veces ya lo hare.

Solo un par de dudas:
Porque tantas comparaciones de fechas en esta funcion?
Es para saber si el usuario ha introducido la fecha actual en la fecha de inicio?

Date.prototype.esElMismoDia = function( otraFecha ) {
return (this.getDate()===otraFecha.getDate()) &&
(this.getMonth()===otraFecha.getMonth()) &&
(this.getFullYear()===otraFecha.getFullYear());
}

y esa es la relacion con esto;
var diasContados = 0;
while( fechaInicio.esElMismoDia( fechaFin ) === false ) {
fechaInicio.sumaUnDia();
diasContados++;
}

Bueno muchas gracias, por la paciencia y entraga.
algun dia me gustaria por lo menos arañar los conocimientos de los que saben.

Saludos
  #11 (permalink)  
Antiguo 02/07/2008, 11:28
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Problemas con los años bisiestos en JavaScript

Gracias por los alagos


Cita:
Iniciado por anje53 Ver Mensaje
Solo un par de dudas:
Porque tantas comparaciones de fechas en esta funcion?
Es para saber si el usuario ha introducido la fecha actual en la fecha de inicio?

Date.prototype.esElMismoDia = function( otraFecha ) {
return (this.getDate()===otraFecha.getDate()) &&
(this.getMonth()===otraFecha.getMonth()) &&
(this.getFullYear()===otraFecha.getFullYear());
}
Esa función lo único que hace es mirar si las dos fechas son iguales (es decir, si coinciden en día, mes y año; hay que mirar las tres variables). No podemos hacer fecha1 === fecha2 en una condicional, ya que no compara lo que queremos, que sólo es el día, mes y año.


Cita:
Iniciado por anje53 Ver Mensaje
y esa es la relacion con esto;
var diasContados = 0;
while( fechaInicio.esElMismoDia( fechaFin ) === false ) {
fechaInicio.sumaUnDia();
diasContados++;
}
Ese es el bucle que suma un día a fechaInicio mientras no sea la misma fecha (dia, mes, año) que fechaFin, simplemente eso. Cuenta los días sumados en la variable diasContados.


Saludos
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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 05:07.