Calcular la edad en Javascript

  • Por
Realizamos y explicamos una función que recibe una fecha de nacimiento y devuelve el número de años desde la fecha, es decir, la edad.
En este artículo vamos a explicar una función que calcula la edad de una persona. Para ello recibe un string con la fecha de nacimiento de la persona y devuelve el número de años que tiene. Estamos ante un ejercicio que ilustra muy bien el trabajo con fechas en Javascript.

Referencia: Para aprender algo que nos sirva de base en el cálculo de fechas sería interesante leer el artículo Clase Date en Javascript.

El método de trabajo

Nosotros estamos pensando en recibir una fecha en formato español: algo como "12/10/1975", de tipo string. Lo primero será separar los distintos valores de año, mes, día. Para ello utilizamos el método split(), que pertenece a la clase String (tipo de la fecha que vamos a recibir), que devuelve un array con el valor de cada una de las partes de la cadena, utilizando como separador el carácter "/". Después de la separación, en el array devuelto, deberíamos tener tres casillas, donde la primera (la de índice 0) guardará el día, la segunda el mes y la tercera el año.

Referencia: Los métodos de la clase String se pueden ver en el artículo Clase String en Javascript.

Vamos a realizar seguidamente algunas comprobaciones para asegurarnos que la fecha es correcta, es decir, que tenemos un valor numérico como día, otro como mes y otro como año. Si no es así devolveremos false, que debería interpretarse como que la función es incapaz de calcular la edad, porque la fecha de nacimiento pasada no es correcta.

A continuación restaremos el número de años de la fecha actual, que podrían ser 2003, con el número de año de la fecha de nacimiento, que será algo como 1975. En este caso nos daría 28, pero nosotros vamos a considerar 27, pues no sabemos si la supuesta persona ha cumplido años en el año en curso, o no. Es decir, hoy que es junio, si cumplió los años en marzo, esa persona ya tendría 28 años, pero si cumple los años en agosto, tendría ahora 27 años.

Así que nuestro próximo paso será saber en qué mes cumplió años la persona y de ello podríamos tener tres casos.
  1. Si el mes actual es menor que el mes de nacimiento. Entonces es que no ha cumplido años todavía en este periodo anual. (Los años, en el ejemplo anterior, serían 27)
  2. Si el mes actual es mayor que el mes de nacimiento, querría decir que esa persona sí ha celebrado su cumpleaños este año. (Los años, en el ejemplo anterior, serían 28)
  3. Si los dos meses son iguales, deberíamos fijarnos en el día, de una manera similar a como se ha realizado para los meses:
    1. Si el día actual es menor que el día de nacimiento, es que le faltan unos días todavía para su cumpleaños (Dado el ejemplo anterior, los años serían 27).
    2. Si el día actual es mayor o igual que el día de nacimiento es que sí ha cumplido años (Dado el ejemplo anterior, los años serían 28).
El script para calcular la edad

Bueno, con estas explicaciones esperamos que cualquiera con un nivel medio de Javascript pudiera realizar el código de esta función, pero el objetivo es mostraros nuestra propuesta de código, que está comentada para que se pueda entender fácilmente.

//calcular la edad de una persona
//recibe la fecha como un string en formato español
//devuelve un entero con la edad. Devuelve false en caso de que la fecha sea incorrecta o mayor que el dia actual
function calcular_edad(fecha){

    //calculo la fecha de hoy
    hoy=new Date()
    //alert(hoy)

    //calculo la fecha que recibo
    //La descompongo en un array
    var array_fecha = fecha.split("/")
    //si el array no tiene tres partes, la fecha es incorrecta
    if (array_fecha.length!=3)
       return false

    //compruebo que los ano, mes, dia son correctos
    var ano
    ano = parseInt(array_fecha[2]);
    if (isNaN(ano))
       return false

    var mes
    mes = parseInt(array_fecha[1]);
    if (isNaN(mes))
       return false

    var dia
    dia = parseInt(array_fecha[0]);
    if (isNaN(dia))
       return false


    //si el año de la fecha que recibo solo tiene 2 cifras hay que cambiarlo a 4
    if (ano<=99)
       ano +=1900

    //resto los años de las dos fechas
    edad=hoy.getYear()- ano - 1; //-1 porque no se si ha cumplido años ya este año

    //si resto los meses y me da menor que 0 entonces no ha cumplido años. Si da mayor si ha cumplido
    if (hoy.getMonth() + 1 - mes < 0) //+ 1 porque los meses empiezan en 0
       return edad
    if (hoy.getMonth() + 1 - mes > 0)
       return edad+1

    //entonces es que eran iguales. miro los dias
    //si resto los dias y me da menor que 0 entonces no ha cumplido años. Si da mayor o igual si ha cumplido
    if (hoy.getUTCDate() - dia >= 0)
       return edad + 1

    return edad
}


Nota: Para entender esta función será necesario saber que, cuando se ejecuta return dentro de una función, se devuelve el valor indicado y se sale de la función, sin que se puedan ejecutar otras sentencias que existan debajo del return.

Autor

Miguel Angel Álvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Moisés Esmeral

02/10/2004
Buenas Tardes

revise la función y te cuento que si funciona, pero cuando se calcula un día menor antes de la fecha de cumpleaños dentro del mismo mes te devuelve la edad como si ya hubieses cumplido años. Si puedes resolver este detalle ya que esto hace que la funció esté mala.

Saludos de Venezuela.

MAEO

Agustin Lopez

18/5/2005
hola, Ampliando un poco el tema sobre el cálculo con fechas, resulta muy común necesitar la cantidad de días entre dos fechas dadas y un método es el siguiente:

- Encontrar la diferencia en dias entre dos fechas:

a) leer las fechas de la forma o asignar las fechas a campos variables

para el ejemplo, asumimos que usamos las fechas en formato ANSI que es AAAA-MM-DD

b) Leemos las fechas de los campos de una forma, que se llama, por ej. "F":

var DF=document.f;

var Fini = DF.fecha_inicial.value;
var Ffin = DF.fecha_final.value;

c) Creamos una expresion regular, para separar los elementos de las fechas (aaaa,mm,dd) para crear verdaderos objetos tipo Date():

// esta es la expresion regular
var regex = /(\d+)-(\d+)-(\d+)/;

// la "fecha inicial"
var aFini = Fini.replace(er,"$1");
var mFini = Fini.replace(er,"$2");
var dFini = Fini.replace(er,"$3");

// la "fecha final"
var aFfin = Ffin.replace(er,"$1");
var mFfin = Ffin.replace(er,"$2");
var dFfin = Ffin.replace(er,"$3");

d) ahora creamos los objetos Date:

var oFini = new Date(aFini,mFini,dFini);
var oFfin = new Date(aFfin,mFfin,dFfin);

e) relizamos la operación, ej. una resta:

var operacion = oFini - oFfin;

Ahora operacion, contiene la diferencia (en este caso) entre ambas fechas en milisegundos, por lo que para obtener la diferencia en dias:

operacion = operacion/86400000;

Claro que podemos hacer:
var operacion =(oFini-oFfin)/86400000;

y listo!.

Espero que les sea de utilidad.
AL.

Hola de nuevo,

cometí un pequeño error,

en las lineas que dicen:

var xFxxx = replace(er,xx);

debe decir;

var xFxxx = replace(regex,xx);

Miguel Angel Alvarez

09/8/2005
Una manera de utilizar esta función en un formulario es la siguiente:




Se entiende que se debe introducir una fecha válida en el campo de texto y pulsar el botón para calcular la edad. La edad se mostrará en el mismo campo de texto.

Por supuesto, se debe colocar el código de la función calcular_edad() en la página, preferiblemente en la cabecera.

roberto

09/12/2005
como se valida el año de nacimiento en html

Paco

05/1/2006
Saludos esta bien tu codigo pero creo q unicamente funciona para personas que nacieron antes del 2000 puesto que si yo igreso dos valores por ejemplo 01 me va a sumar 1900 + 01 y me va a restar la fecha actual menos esa cantidad. Y por lo tanto me dara una edad de una persona que nacio en los años 1900 y no en los 2000. Saludos y suerte espero encontrar una solucion que sea mas factible

Manuel Santamaria

16/3/2006
Calcular la edad en PHP

<?php
// Fecha actual
$date = getdate();
$anioact = $date["year"];
$mesact = $date["mon"];
$diaact = $date["mday"];

// Fecha de nacimiento de ejemplo para el test
$fechanac = "1981-07-04";
// Desglosamos la fecha recibida, como si fuese ingreada en un Form u obtenida de una base de datos
list( $anionac, $mesnac, $dianac ) = split('-', $fechanac);
//Verificamos que la fecha es correcta
if (checkdate ( $mesnac, $dianac, $anionac )){
$fechanac = ($anionac."-".$mesnac."-".$dianac);
} else {
die("Fecha incorrecta");
}
//Calculo de la edad al dia de hoy
$edad = $anioact - $anionac;
if ($mesact < $mesnac){
$edad--;
} elseif ($mesact == $mesnac){
if ($diaact < $dianac){
$edad--;
}
}
echo $edad;
?>

pochola

28/3/2006
Amigo podrias ayudarme tengo que calcular la edad de una persona mas de eso debo decirle, cuanto dias,meses y semanas de vida tiene si nacio en un año bisiesto o no y saber cuanto mese o dias faltan para que llegue su cumpleaños de antemanos muchas gracisas
Por fa es un parcial y no tengo ni idea de PHP y lo necesito urgente es para hoy
ayundenmeeeeeeeeeeeeeee

Lucas Alvarez

29/3/2006
He probado esta función y hay un caso en el que falla es que si el usuario cumple años el mismo mes en en que nos encontramos. Yo hice el siguiente ejemplo. fecha de hoy: 29/03/2006. fecha de nacimiento: 31/03/1981 y devuelve null.

Stip Veramendi

04/7/2006
Saludos amigos, estuve probando el script para el cálculo de la edad funciona con la edad de mis amigos menos con mi fecha de nacimiento, el tema es que para fechas con meses por encima del mes de julio el script falla, aumentando un año, bueno tal vez pueden existir otros errores, no sé si por favor podrían ayudarme a encontrar cual es el inconveniente??
Gracias

Stip

04/7/2006
Buena Manuel Santamaria, ese codigo si esta mejor, mas simple y fucniona.. gracias.. tendras mas codigos..?
vs_stip@hotmail.com

LUIS

15/7/2006
Que tal amigos programadores todo ese codigo esta muy bien ya lo puse en practica pero quisiera ver si me pueden ayudar con el calculo en el Lenguaje de PROLOG gracias.

Xavi Montaña

08/8/2006
En versión PHP. La fecha de nacimiento se ha de pasar en formato mysql (aaaa-mm-dd).


function calcula_edat($data){
$naixament=split('-',$data);
$edad=date(Y) -$naixament[0] - 1;

if (date(m) +1 - $naixament[1] < 0)
return $edad;
if (date(m) +1 - $naixament[1] > 0)
return $edad+1;

if (date(d) - $naixament[2] >=0)
return $edad+1;

return $edad;

}

Luis

28/8/2007
Tengo un problema al ingresa unas Fecha inicial
ejemplo
Fecha Inicial 2007-8-31
Fecha Final 2007-9-01
Sale diferencia de 0, igual para todas las fechas que terminen en 31.

oswal

25/2/2008
Hola, muchas gracias por el script del cálculo de la edad.
Tuve que cambir algo en la siguiente línea:
Cambié la función que estaba antes ( getYear() )
por la que está aquí. Ya que devolvía datos errados.

edad=hoy.getUTCFullYear()- ano - 1;

de esta forma si devuelve la edad correcta.

Hasta pronto.


Josser Ramirez

19/10/2008
formamas rapida y practica de obtener la edad:

function calcular_edad(fecha){
//calculo la fecha de hoy
hoy=new Date();
anoactual=hoy.getFullYear();

//calculo la fecha que recibo
//La descompongo en un array
var array_fecha = fecha.split("/")
//si el array no tiene tres partes, la fecha es incorrecta
if (array_fecha.length!=3)
return false

//compruebo que los ano, mes, dia son correctos
var ano

ano = parseInt(array_fecha[2]);
//alert (ano);
if (isNaN(ano))
return false
/* esto es lo importante */
edad=anoactual-ano;
alert(edad);
/* esto es lo importante */

var mes

mes = parseInt(array_fecha[1]);
// alert (mes);
if (isNaN(mes))
return false

var dia

dia = parseInt(array_fecha[0]);
// alert (dia);
if (isNaN(dia))
return false

return edad
}

JULINAS

11/12/2008
función Javascript:
calcular_edad

Oye muchas gracias por la funcióncita me acaba de ser bastante útil.

Pero una Observación para que se corrija:

en la línea:
var array_fecha = fecha.split("/");

debe ir así:
var array_fecha = fecha.value.split("/");

de lo contrarío Genera Error de JavaScript.

Por lo demás Excelente Aporte.

Muchas Gracias.

Aftorres

12/4/2009
Fechas meses Agosto y Septiembre
Cualquier Fecha de los meses Agosto y Septiembre, me suma un año mas del que corresponde.

Pedro

15/6/2009
Solucion a fallos en calculo de edad
Para resolver los problemas con los meses en los calculos de la edad se deben cambiar las siguientes lineas.
Donde pone: ano = parseInt(array_fecha[2])
se debe cambiar por: ano = parseInt(array_fecha[2],10)
Donde pone: mes = parseInt(array_fecha[1])
se debe cambiar por: mes = parseInt(array_fecha[1],10)
Donde pone:dia = parseInt(array_fecha[0])
se debe cambiar por: dia = parseInt(array_fecha[0],10)

Esto es por que al hacer la funcion parseInt con 08 y 09 no coge bien la base y devuelve 0, al decirle que la base es 10 se resuelve el problema

Alan

19/9/2009
Problema en Google Chrom
Hola queria avisar que use la function y me da problemas en Google Chrom.. al ingresar una fecha validada me devuelve una edad erronea.

Por ejemplo:

Ingrese: 18/11/1994

Devolvio: -1886

supongo que debe ser un problema en los return previos al return final.. me refiero a estos:

if (hoy.getMonth() + 1 - mes < 0)
[b]return edad[/b]
if (hoy.getMonth() + 1 - mes > 0)
[b]return edad+1[/b]
if (hoy.getUTCDate() - dia >= 0)
[b]return edad+1[/b]


espero que halla solucion, asi queda una buena function ;)

rocio

27/1/2010
pz p` saludar
no mammmmmmmmmmmmmmmmmmmmmmm eso a mi no m ineresa

Juan Esteban Angulo

05/4/2010
Tema fechas
amigo muchas gracias no sabi lo d e la division en milisegundos trate de hacerlo y no me daba pero con tu ejemplo problema resuelto no sabes cuanto te agradesco!!!

Paul

26/4/2010
Error en el codigo para maquinas que aceptan años de 4 digitos
Sugiero que se cambie la parte de


edad = hoy.getYear() - ano - 1;

Por

edad = hoy.getFullYear() - ano - 1;

julio

19/7/2011
porque no ponen el html
esta bien el codigo pero porque no ponen con todo el html, osea los inputs y cosas asi, sino no se como poner el java

Juanjo

29/7/2011
ojo con los bisiestos
El método de Agustín lo he visto en otros sitios, pero hay que tener en cuenta que hay años bisiestos, con lo que el resultado podría no ser correcto.

Saludos

juanra

23/9/2011
formula corta
function edad(Fecha){
fecha = new Date(Fecha)
hoy = new Date()
ed = parseInt((hoy -fecha)/365/24/60/60/1000);
return ed;
}

gianpierre

25/4/2014
me pueden ayudar en este problema de javascript-netbeans
crea un programa que imprima tu edad . debe ingresar la fecha actuale
ingrese tu fecha de nacimiento.

imprimir en una caja de texto

nogoar

13/5/2014
Error en la function calcular_Edad()
Hola 1ro que todo felicitarlos por el amplio contenido que hay en la pagina y sobre todo la forma facil como se explica todo que hace facil entender.

2do. Eh estado siguiendo este tutorial ya hace varios dias desde "Programación en Javascript I" y hasta ahora me encuentro con el primer error de codigo que dejan en los ejemplos.

Los errores estan al tratar de asignar año, mes, dia, de la fecha de nacimiento que separo el metodo .split("/"), cuando se asignan por llamados a la matriz
var ano
ano = parseInt(array_fecha[0]); //aqui se tenia [2] estaba asignando el dia a la variable ano
if (isNaN(ano))
return false

var mes
mes = parseInt(array_fecha[1]);
if (isNaN(mes))
return false

var dia
dia = parseInt(array_fecha[2]); //aqui se tenia [0] estaba asignando el año a la variable dia
if (isNaN(dia))
return false

//el otro error esta aqui: en el metodo .getYear, yo lo cambie a .getFulYear, y haciendo estos cambios me funciona perfecto.
//resto los años de las dos fechas
edad=hoy.getYear()- ano - 1; //-1 porque no se si ha cumplido años ya este año


espero me entiendan... gracias por el tuto esta Genial

luzmaria

26/5/2014
Realizar un codigo java-scrip que calculr la edad de cualquier persona dea cuerdp al año de nacimiento
no se como hacerlo me podrian ayudar

luzmaria

26/5/2014
Realizar un codigo java-scrip que calcule la edad de cualquier persona de acuerdo al año de nacimiento
lo ciento por no escribirlo bien antes ayuden me pliss