Calcule la edad dada la fecha de nacimiento en el formato AAAAMMDD

285

¿Cómo puedo calcular una edad en años, dada una fecha de nacimiento con el formato AAAAMMDD? ¿Es posible usar la Date()función?

Estoy buscando una solución mejor que la que estoy usando ahora:

var dob = '19800810';
var year = Number(dob.substr(0, 4));
var month = Number(dob.substr(4, 2)) - 1;
var day = Number(dob.substr(6, 2));
var today = new Date();
var age = today.getFullYear() - year;
if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) {
  age--;
}
alert(age);

Francisc
fuente
Tenga en cuenta su formateo, no lo haga como lo hizo; simplemente sangra tu código con 4 espacios usando el botón de código (010101) o Ctrl-K.
Marcel Korpel
Lo hice pero no funciona en IE9 Beta, así que tuve que hacerlo a mano.
Francisc
44
Su solución original es mejor, al calcular la edad, que las respuestas actuales. La respuesta de Júlio Santos es esencialmente la misma. Las otras respuestas dan resultados inexactos en muchas condiciones, y pueden ser menos directas o menos eficientes.
Brock Adams
Gracias Brock Esperaba que hubiera una forma más elegante de hacer esto que la que parece un poco tosca.
Francisc
44
@Francisc, es crudo, pero es lo que el Dateobjeto tendría que hacer si lo encapsulara. La gente podría escribir libros sobre la insolencia del Datemanejo de JS . ... Si puedes vivir a veces con un día de descanso, entonces la aproximación: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )es lo más simple que puedes conseguir.
Brock Adams

Respuestas:

245

Yo iría por la legibilidad:

function _calculateAge(birthday) { // birthday is a date
    var ageDifMs = Date.now() - birthday.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    return Math.abs(ageDate.getUTCFullYear() - 1970);
}

Descargo de responsabilidad: esto también tiene problemas de precisión, por lo que tampoco se puede confiar completamente en esto. Puede estar apagado por algunas horas, algunos años o durante el horario de verano (dependiendo de la zona horaria).

En cambio, recomendaría usar una biblioteca para esto, si la precisión es muy importante. Además @Naveens post, es probablemente el más preciso, ya que no depende de la hora del día.


Puntos de referencia: http://jsperf.com/birthday-calculation/15

André Snede Kock
fuente
3
Esto devuelve 0 años para fechas como 2000-02-29 a 2001-02-28 cuando probablemente debería regresar 1.
RobG
16
@RobG No creo que haya pasado técnicamente un año completo del 2000-02-29 al 2001-02-28, por lo que su respuesta no es válida. No tendría sentido, 2000-02-28 a 2001-02-28 es un año, entonces 2000-02-29 a 2001-02-28, debe ser menos de un año.
André Snede Kock
3
No dio más detalles sobre lo que significa "no preciso", pensé que la información adicional podría ser útil. Puede considerar solucionar los problemas o eliminar la respuesta.
RobG
1
@RobG En realidad lo hice. También señalé una solución mejor que la mía. Mi solución resuelve el problema de una manera fácil de leer, con pequeños problemas de precisión, pero dentro de los límites de su propósito.
André Snede Kock
1
Encantadora respuesta @ AndréSnedeHansen y rápido también, ya que no tienes esa división loca como está presente en mi respuesta ;-) +1 por legibilidad y velocidad.
Kristoffer Dorph
506

Prueba esto.

function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

Creo que lo único que parecía crudo en su código fue la substrparte.

Fiddle : http://jsfiddle.net/codeandcloud/n33RJ/

naveen
fuente
¿Puedes dar un ejemplo de uso? No podría hacer que funcione sin modificar la función para tomar 3 argumentos separados, como: getAge (y, m, d). Por ejemplo: jsbin.com/ehaqiw/1/edit
edt
Como muchos otros, esto piensa que 2000-02-29 a 2001-02-28 es cero años, cuando probablemente debería ser 1 (ya que 2001-03-01 debería ser 1 año 1 día).
RobG
3
@RobG: cuando los leaplings 'celebran' (la respuesta común a esa pregunta en realidad solo parece ser: 'el fin de semana más cercano a la fecha real') su día de nacimiento difiere según el contexto, incluyendo: región geográfica (inglés simple: dónde vives ), LEY (no lo subestimes), religión y preferencia personal (incluido el comportamiento grupal): Algunas razones: "Nací en febrero", otras razones: "Nací el día después del 28 de febrero" (que es más comúnmente el 1 de marzo) en.wikipedia.org/wiki/February_29 Por todo lo anterior, esto es correcto SI el 1 de marzo es el resultado del año escolar que uno necesita
GitaarLAB
3
@RobG: El pozo negro de 'más x mes (es)' es irrelevante para la noción humana de edad en años. La noción humana común es que el contador de edad (InYears) aumenta todos los días (sin tener en cuenta el tiempo) cuando el calendario tiene el mismo mes # y día # (en comparación con la fecha de inicio): de modo que 2000-02-28 a 2001-02 -27 = 0 años y 2000-02-28 a 2001-02-28 = 1 año. Extender ese 'sentido común' a los niveles: 2000-02-29 (el día después de 2000-02-28) a 2001-02-28 = cero años . Mi comentario simplemente decía que el algo respondido siempre da la respuesta humana 'correcta' SI uno espera / acepta esta lógica para los avances.
GitaarLAB
3
@RobG: nunca dije que yo o la respuesta era universalmente correcta (TM). Incluí la noción de contextos / jurisdicciones / puntos de vista. Mis dos comentarios incluyen claramente un IF en mayúscula (hacia el manejo de los niveles de excepción). De hecho, mi primer comentario declaró exactamente lo que quería decir y nunca incluyó ningún juicio sobre lo correcto o lo incorrecto. En efecto, mis comentarios aclaran qué y qué no esperar (y por qué) de esta respuesta (como lo llaman "resaltar los problemas"). Ps: 31 de febrero?!?
GitaarLAB
72

Importante: esta respuesta no proporciona una respuesta 100% precisa, está desactivada por alrededor de 10-20 horas dependiendo de la fecha.

No hay mejores soluciones (no en estas respuestas de todos modos). - naveen

Por supuesto, no pude resistir el impulso de aceptar el desafío y hacer una calculadora de cumpleaños más rápida y más corta que la solución aceptada actual. El punto principal de mi solución es que las matemáticas son rápidas, por lo que, en lugar de usar ramificaciones, y el modelo de fecha que JavaScript proporciona para calcular una solución, usamos las maravillosas matemáticas

La respuesta se ve así, y corre ~ 65% más rápido que la de naveen, además es mucho más corta:

function calcAge(dateString) {
  var birthday = +new Date(dateString);
  return ~~((Date.now() - birthday) / (31557600000));
}

El número mágico: 31557600000 es 24 * 3600 * 365.25 * 1000, que es la duración de un año, la duración de un año es de 365 días y 6 horas, que es de 0.25 días. Al final, suelo el resultado que nos da la edad final.

Aquí están los puntos de referencia: http://jsperf.com/birthday-calculation

Para admitir el formato de datos de OP, puede reemplazar +new Date(dateString);
con+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Si puede encontrar una solución mejor, ¡comparta! :-)

Kristoffer Dorph
fuente
Esa es una solución genial. El único problema que veo con él es que el dateStringargumento es justo para que el constructor Date () lo analice correctamente. Por ejemplo, tomando el YYYYMMDDformato que di en la pregunta, fallará.
Francisc
22
Esta respuesta tiene un error. Pon tu reloj en 12:01 am. A las 12:01 a.m., si calculaAge ('2012-03-27') (fecha de hoy) obtendrá una respuesta de cero, aunque debería ser igual a 1. Este error existe durante toda la hora de las 12:00 a.m. Esto se debe a la declaración incorrecta de que un año tiene 365.25 días. No es asi. Estamos tratando con años calendario, no con la longitud de la órbita de la Tierra (que es más exactamente 365.256363 días). Un año tiene 365 días, excepto un año bisiesto que tiene 366 días. Además de eso, el rendimiento en algo como esto no tiene sentido. La mantenibilidad es mucho más importante.
Eric Brandel
1
Gracias por su solución Kristoffer. ¿Puedo preguntar qué hace + nuevo en comparación con solo nuevo, y también las dos tildes (~) en el retorno?
Frank Jensen
1
@FrankJensen Hola Frank, también tenía curiosidad y encontré esta respuesta: doble tilde convierte el flotador en entero Saludos
Stano
1
@FrankJensen esencialmente la tilde invierte el número (el valor binario) mientras convierte flotante a entero (con suelo), por lo tanto, dos tildes le dan el número redondeado. El + delante de la nueva Fecha () convierte el objeto en la representación entera del objeto de fecha, esto también se puede usar con cadenas de números, por ejemplo + '21 '=== 21
Kristoffer Dorph
55

Con momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
Vitor Tyburski
fuente
2
@RicardoPontual esto requiere momentos, así que no puede ser la mejor respuesta.
itzmukeshy7
13
@ itzmukeshy7 de hecho, para que una respuesta sea la mejor, al menos debería requerir jQuery;)
thomaux 02 de
@thomaux ¡Depende totalmente del entorno de desarrollo!
itzmukeshy7
@ itzmukeshy7 relájate, es una broma;) ver: meta.stackexchange.com/a/19492/173875
thomaux el
2
@thomaux Sabía que es una broma;)
itzmukeshy7
38

Solución limpia de una línea usando ES6:

const getAge = birthDate => Math.floor((new Date() - new Date(birthDate).getTime()) / 3.15576e+10)

// today is 2018-06-13
getAge('1994-06-14') // 23
getAge('1994-06-13') // 24

Estoy usando un año de 365.25 días (0.25 debido a años bisiestos) que son 3.15576e + 10 milisegundos (365.25 * 24 * 60 * 60 * 1000) respectivamente.

Lucas Janon
fuente
1
Bastante ordenado, ¿podría explicar qué significa 3.15576e + 10?
leonheess
1
Sí, sería bueno agregar la siguiente línea antes de la función:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon
12

Hace algún tiempo hice una función con ese propósito:

function getAge(birthDate) {
  var now = new Date();

  function isLeap(year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  // days since the birthdate    
  var days = Math.floor((now.getTime() - birthDate.getTime())/1000/60/60/24);
  var age = 0;
  // iterate the years
  for (var y = birthDate.getFullYear(); y <= now.getFullYear(); y++){
    var daysInYear = isLeap(y) ? 366 : 365;
    if (days >= daysInYear){
      days -= daysInYear;
      age++;
      // increment the age only if there are available enough days for the year.
    }
  }
  return age;
}

Toma un objeto Date como entrada, por lo que debe analizar la 'YYYYMMDD'cadena de fecha con formato:

var birthDateStr = '19840831',
    parts = birthDateStr.match(/(\d{4})(\d{2})(\d{2})/),
    dateObj = new Date(parts[1], parts[2]-1, parts[3]); // months 0-based!

getAge(dateObj); // 26
CMS
fuente
Ah sí, me perdí el año bisiesto. Gracias.
Francisc
1
¡Esto proporciona valores no válidos para combinaciones de fechas seleccionadas! Por ejemplo, si birthDatees el 5 de enero de 1980 y la fecha actual es el 4 de enero de 2005 , entonces la función informará erróneamente agecomo 25 ... El valor correcto es 24.
Brock Adams
@BrockAdams ¿Por qué es esto? Estoy teniendo este problema en este momento. Gracias.
Jack H
@VisionIncision, porque no maneja las condiciones de borde correctamente. Lo creas o no, el código de la pregunta es el mejor enfoque, aunque parece que una de las respuestas posteriores podría haberlo reenvasado de manera más adecuada.
Brock Adams
CMS Hola :-) Escribí esta pregunta ( stackoverflow.com/questions/16435981/… ) y me dijeron que si quiero una respuesta 100% precisa, debería verificar cada año, si es un año bisiesto, y luego calcular el último fracción. (Ver la respuesta de Guffa). Tu función (parte de ella) hace eso . pero, ¿cómo puedo usarlo para calcular la edad con un 100% de precisión? el DOB rara vez comienza en 1/1 / aaaa ... entonces, ¿cómo puedo usar su función para calcular la edad exacta?
Royi Namir
10

Aquí está mi solución, simplemente pase una fecha analizable:

function getAge(birth) {
  ageMS = Date.parse(Date()) - Date.parse(birth);
  age = new Date();
  age.setTime(ageMS);
  ageYear = age.getFullYear() - 1970;

  return ageYear;

  // ageMonth = age.getMonth(); // Accurate calculation of the month part of the age
  // ageDay = age.getDate();    // Approximate calculation of the day part of the age
}
Kinergy
fuente
7

Solución alternativa, porque por qué no:

function calculateAgeInYears (date) {
    var now = new Date();
    var current_year = now.getFullYear();
    var year_diff = current_year - date.getFullYear();
    var birthday_this_year = new Date(current_year, date.getMonth(), date.getDate());
    var has_had_birthday_this_year = (now >= birthday_this_year);

    return has_had_birthday_this_year
        ? year_diff
        : year_diff - 1;
}
Josh
fuente
5
function age()
{
    var birthdate = $j('#birthDate').val(); // in   "mm/dd/yyyy" format
    var senddate = $j('#expireDate').val(); // in   "mm/dd/yyyy" format
    var x = birthdate.split("/");    
    var y = senddate.split("/");
    var bdays = x[1];
    var bmonths = x[0];
    var byear = x[2];
    //alert(bdays);
    var sdays = y[1];
    var smonths = y[0];
    var syear = y[2];
    //alert(sdays);

    if(sdays < bdays)
    {
        sdays = parseInt(sdays) + 30;
        smonths = parseInt(smonths) - 1;
        //alert(sdays);
        var fdays = sdays - bdays;
        //alert(fdays);
    }
    else{
        var fdays = sdays - bdays;
    }

    if(smonths < bmonths)
    {
        smonths = parseInt(smonths) + 12;
        syear = syear - 1;
        var fmonths = smonths - bmonths;
    }
    else
    {
        var fmonths = smonths - bmonths;
    }

    var fyear = syear - byear;
    document.getElementById('patientAge').value = fyear+' years '+fmonths+' months '+fdays+' days';
}
Sarwar
fuente
Gracias fácil de encontrar la edad en años meses y días
Sumit Kumar Gupta
5

Para probar si el cumpleaños ya pasó o no, defino una función auxiliar Date.prototype.getDoY, que efectivamente devuelve el número de día del año. El resto se explica por sí mismo.

Date.prototype.getDoY = function() {
    var onejan = new Date(this.getFullYear(), 0, 1);
    return Math.floor(((this - onejan) / 86400000) + 1);
};

function getAge(birthDate) {
    function isLeap(year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    var now = new Date(),
        age = now.getFullYear() - birthDate.getFullYear(),
        doyNow = now.getDoY(),
        doyBirth = birthDate.getDoY();

    // normalize day-of-year in leap years
    if (isLeap(now.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyNow--;

    if (isLeap(birthDate.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyBirth--;

    if (doyNow <= doyBirth)
        age--;  // birthday not yet passed this year, so -1

    return age;
};

var myBirth = new Date(2001, 6, 4);
console.log(getAge(myBirth));
Marcel Korpel
fuente
Esto da resultados inexactos en años bisiestos, para cumpleaños después del 28 de febrero. Envejece a esas personas por 1 día. EG: para DoB = 04/07/2001 , esta función devolverá 7 años, en 2008/07/03 .
Brock Adams
@Brock: Gracias. Si no me equivoco, he corregido este comportamiento erróneo.
Marcel Korpel
Sí, creo que podría haberlo hecho (no lo he probado rigurosamente, solo lo he analizado). Pero, tenga en cuenta que la nueva solución no es más simple ni más elegante que la solución del OP (sin contar que esta está correctamente encapsulada en una función). ... La solución del OP es más fácil de entender (por lo tanto, auditar, probar o modificar). A veces, lo mejor es simple y directo, en mi opinión.
Brock Adams
@Brock: Estoy totalmente de acuerdo: tengo que pensar en lo que hace esta función y eso nunca es bueno.
Marcel Korpel
¿No debería "if (doyNow <doyBirth)" ser "if (doyNow <= doyBirth)"? En todas mis pruebas, el día ha estado libre para una y eso lo solucionó.
Ted Kulp
5

Creo que podría ser simplemente así:

function age(dateString){
    let birth = new Date(dateString);
    let now = new Date();
    let beforeBirth = ((() => {birth.setDate(now.getDate());birth.setMonth(now.getMonth()); return birth.getTime()})() < birth.getTime()) ? 0 : 1;
    return now.getFullYear() - birth.getFullYear() - beforeBirth;
}

age('09/20/1981');
//35

Funciona también con una marca de tiempo

age(403501000000)
//34
romuleald
fuente
Este código calculará una persona que tenga la misma edad todo el año. En su ejemplo, si hoy fuera el 19/09/2018, el código daría 37, pero la edad (el día antes del cumpleaños) sería 36 ...
Steve Goossens
4

Solo tenía que escribir esta función por mí mismo: la respuesta aceptada es bastante buena, pero la OMI podría usar algo de limpieza. Esto requiere una marca de tiempo de Unix para Dob porque ese era mi requisito, pero podría adaptarse rápidamente para usar una cadena:

var getAge = function(dob) {
    var measureDays = function(dateObj) {
            return 31*dateObj.getMonth()+dateObj.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - (measureDays(now) < measureDays(d));
}

Observe que he usado un valor plano de 31 en mi función measureDays. Lo único que le importa al cálculo es que el "día del año" sea una medida monótonamente creciente de la marca de tiempo.

Si usa una marca de tiempo o cadena de JavaScript, obviamente querrá eliminar el factor de 1000.

Keith Nordstrom
fuente
n es indefinido. Creo que te refieres a now.getFullYear ()
Larry Battle
4
function getAge(dateString) {

    var dates = dateString.split("-");
    var d = new Date();

    var userday = dates[0];
    var usermonth = dates[1];
    var useryear = dates[2];

    var curday = d.getDate();
    var curmonth = d.getMonth()+1;
    var curyear = d.getFullYear();

    var age = curyear - useryear;

    if((curmonth < usermonth) || ( (curmonth == usermonth) && curday < userday   )){

        age--;

    }

    return age;
}

Para saber la edad en la que ha entrado la fecha europea:

getAge('16-03-1989')
Martijn van Hoof
fuente
Gracias por su sugerencia en stackoverflow.com/a/13367162/1055987 buena captura.
JFK
3

Una posible solución más con moment.js :

var moment = require('moment');
var startDate = new Date();
var endDate = new Date();
endDate.setDate(endDate.getFullYear() + 5); // Add 5 years to second date
console.log(moment.duration(endDate - startDate).years()); // This should returns 5
Michael Yurin
fuente
2

Revisé los ejemplos mostrados anteriormente y no funcionaron en todos los casos, y debido a esto hice un guión propio. Probé esto, y funciona perfectamente.

function getAge(birth) {
   var today = new Date();
   var curr_date = today.getDate();
   var curr_month = today.getMonth() + 1;
   var curr_year = today.getFullYear();

   var pieces = birth.split('/');
   var birth_date = pieces[0];
   var birth_month = pieces[1];
   var birth_year = pieces[2];

   if (curr_month == birth_month && curr_date >= birth_date) return parseInt(curr_year-birth_year);
   if (curr_month == birth_month && curr_date < birth_date) return parseInt(curr_year-birth_year-1);
   if (curr_month > birth_month) return parseInt(curr_year-birth_year);
   if (curr_month < birth_month) return parseInt(curr_year-birth_year-1);
}

var age = getAge('18/01/2011');
alert(age);
paulinho
fuente
¿Deberían ser del 2000-02-29 al 2001-02-28 un año? Si es así, entonces lo anterior no es perfecto. :-)
RobG
2

Esa es la forma más elegante para mí:

const getAge = (birthDateString) => {
  const today = new Date();
  const birthDate = new Date(birthDateString);

  const yearsDifference = today.getFullYear() - birthDate.getFullYear();

  if (
    today.getMonth() < birthDate.getMonth() ||
    (today.getMonth() === birthDate.getMonth() && today.getDate() < birthDate.getDate())
  ) {
    return yearsDifference - 1;
  }

  return yearsDifference;
};

console.log(getAge('2018-03-12'));

Krzysztof Dąbrowski
fuente
1

Obtenga la edad (años, meses y días) desde la fecha de nacimiento con javascript

Función calcularEdad (años, meses y días)

function calcularEdad(fecha) {
        // Si la fecha es correcta, calculamos la edad

        if (typeof fecha != "string" && fecha && esNumero(fecha.getTime())) {
            fecha = formatDate(fecha, "yyyy-MM-dd");
        }

        var values = fecha.split("-");
        var dia = values[2];
        var mes = values[1];
        var ano = values[0];

        // cogemos los valores actuales
        var fecha_hoy = new Date();
        var ahora_ano = fecha_hoy.getYear();
        var ahora_mes = fecha_hoy.getMonth() + 1;
        var ahora_dia = fecha_hoy.getDate();

        // realizamos el calculo
        var edad = (ahora_ano + 1900) - ano;
        if (ahora_mes < mes) {
            edad--;
        }
        if ((mes == ahora_mes) && (ahora_dia < dia)) {
            edad--;
        }
        if (edad > 1900) {
            edad -= 1900;
        }

        // calculamos los meses
        var meses = 0;

        if (ahora_mes > mes && dia > ahora_dia)
            meses = ahora_mes - mes - 1;
        else if (ahora_mes > mes)
            meses = ahora_mes - mes
        if (ahora_mes < mes && dia < ahora_dia)
            meses = 12 - (mes - ahora_mes);
        else if (ahora_mes < mes)
            meses = 12 - (mes - ahora_mes + 1);
        if (ahora_mes == mes && dia > ahora_dia)
            meses = 11;

        // calculamos los dias
        var dias = 0;
        if (ahora_dia > dia)
            dias = ahora_dia - dia;
        if (ahora_dia < dia) {
            ultimoDiaMes = new Date(ahora_ano, ahora_mes - 1, 0);
            dias = ultimoDiaMes.getDate() - (dia - ahora_dia);
        }

        return edad + " años, " + meses + " meses y " + dias + " días";
    }

Funcion esNumero

function esNumero(strNumber) {
    if (strNumber == null) return false;
    if (strNumber == undefined) return false;
    if (typeof strNumber === "number" && !isNaN(strNumber)) return true;
    if (strNumber == "") return false;
    if (strNumber === "") return false;
    var psInt, psFloat;
    psInt = parseInt(strNumber);
    psFloat = parseFloat(strNumber);
    return !isNaN(strNumber) && !isNaN(psFloat);
}
Angeldev
fuente
1

Funciona perfecto para mí, muchachos.

getAge(birthday) {
    const millis = Date.now() - Date.parse(birthday);
    return new Date(millis).getFullYear() - 1970;
}
20 fps
fuente
0

Sé que este es un hilo muy antiguo, pero quería poner en esta implementación que escribí para encontrar la edad que creo que es mucho más precisa.

var getAge = function(year,month,date){
    var today = new Date();
    var dob = new Date();
    dob.setFullYear(year);
    dob.setMonth(month-1);
    dob.setDate(date);
    var timeDiff = today.valueOf() - dob.valueOf();
    var milliInDay = 24*60*60*1000;
    var noOfDays = timeDiff / milliInDay;
    var daysInYear = 365.242;
    return  ( noOfDays / daysInYear ) ;
}

Por supuesto, puede adaptar esto para que se ajuste a otros formatos de obtención de los parámetros. Espero que esto ayude a alguien que busca una mejor solución.

ganaraj
fuente
0

Usé este enfoque usando la lógica en lugar de las matemáticas. Es preciso y rápido. Los parámetros son el año, mes y día del cumpleaños de la persona. Devuelve la edad de la persona como un número entero.

function calculateAge(year, month, day) {
        var currentDate = new Date();
        var currentYear = currentDate.getFullYear();
        var currentMonth = currentDate.getUTCMonth() + 1;
        var currentDay = currentDate.getUTCDate();
        // You need to treat the cases where the year, month or day hasn't arrived yet.
        var age = currentYear - year;
        if (currentMonth > month) {
            return age;
        } else {
            if (currentDay >= day) {
                return age;
            } else {
                age--;
                return age;
            }
        }
    }
Pedro Alvares
fuente
cadenas u objetos de fecha para entrada según OP
nazim
0

Adoptando las publicaciones de OP de naveen y originales, terminé con un trozo de método reutilizable que acepta cadenas y / u objetos JS Date.

Lo nombré gregorianAge()porque este cálculo da exactamente cómo denotamos la edad usando el calendario gregoriano. es decir, sin contar el año final si el mes y el día son anteriores al mes y al día del año de nacimiento.

/**
 * Calculates human age in years given a birth day. Optionally ageAtDate
 * can be provided to calculate age at a specific date
 *
 * @param string|Date Object birthDate
 * @param string|Date Object ageAtDate optional
 * @returns integer Age between birthday and a given date or today
 */
function gregorianAge(birthDate, ageAtDate) {
  // convert birthDate to date object if already not
  if (Object.prototype.toString.call(birthDate) !== '[object Date]')
    birthDate = new Date(birthDate);

  // use today's date if ageAtDate is not provided
  if (typeof ageAtDate == "undefined")
    ageAtDate = new Date();

  // convert ageAtDate to date object if already not
  else if (Object.prototype.toString.call(ageAtDate) !== '[object Date]')
    ageAtDate = new Date(ageAtDate);

  // if conversion to date object fails return null
  if (ageAtDate == null || birthDate == null)
    return null;


  var _m = ageAtDate.getMonth() - birthDate.getMonth();

  // answer: ageAt year minus birth year less one (1) if month and day of
  // ageAt year is before month and day of birth year
  return (ageAtDate.getFullYear()) - birthDate.getFullYear() 
  - ((_m < 0 || (_m === 0 && ageAtDate.getDate() < birthDate.getDate())) ? 1 : 0)
}

// Below is for the attached snippet

function showAge() {
  $('#age').text(gregorianAge($('#dob').val()))
}

$(function() {
  $(".datepicker").datepicker();
  showAge();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

DOB:
<input name="dob" value="12/31/1970" id="dob" class="datepicker" onChange="showAge()" /> AGE: <span id="age"><span>

nazim
fuente
0

Dos opciones más:

// Int Age to Date as string YYY-mm-dd
function age_to_date(age)
{
    try {
        var d = new Date();
        var new_d = '';
        d.setFullYear(d.getFullYear() - Math.abs(age));
        new_d = d.getFullYear() + '-' + d.getMonth() + '-' + d.getDate();

        return new_d;
    } catch(err) {
        console.log(err.message);
    }
}
// Date string (YYY-mm-dd) to Int age (years old)
function date_to_age(date)
{
    try {
        var today = new Date();
        var d = new Date(date);

        var year = today.getFullYear() - d.getFullYear();
        var month = today.getMonth() - d.getMonth();
        var day = today.getDate() - d.getDate();
        var carry = 0;

        if (year < 0)
            return 0;
        if (month <= 0 && day <= 0)
            carry -= 1;

        var age = parseInt(year);
        age += carry;

        return Math.abs(age);
    } catch(err) {
        console.log(err.message);
    }
}
rsnoopy
fuente
0

He actualizado algunas de las respuestas anteriores.

var calculateAge = function(dob) {
    var days = function(date) {
            return 31*date.getMonth() + date.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - ( measureDays(now) < measureDays(d));
}

Espero que ayude: D

Fabricio
fuente
0

Aquí hay una manera simple de calcular la edad:

//dob date dd/mm/yy 
var d = 01/01/1990


//today
//date today string format 
var today = new Date(); // i.e wed 04 may 2016 15:12:09 GMT
//todays year
var todayYear = today.getFullYear();
// today month
var todayMonth = today.getMonth();
//today date
var todayDate = today.getDate();

//dob
//dob parsed as date format   
var dob = new Date(d);
// dob year
var dobYear = dob.getFullYear();
// dob month
var dobMonth = dob.getMonth();
//dob date
var dobDate = dob.getDate();

var yearsDiff = todayYear - dobYear ;
var age;

if ( todayMonth < dobMonth ) 
 { 
  age = yearsDiff - 1; 
 }
else if ( todayMonth > dobMonth ) 
 {
  age = yearsDiff ; 
 }

else //if today month = dob month
 { if ( todayDate < dobDate ) 
  {
   age = yearsDiff - 1;
  }
    else 
    {
     age = yearsDiff;
    }
 }
SSS
fuente
0
var now = DateTime.Now;
var age = DateTime.Now.Year - dob.Year;
if (now.Month < dob.Month || now.Month == dob.Month && now.Day < dob.Day) age--;
DBoi
fuente
Hace una simple diferencia de año entre ahora y el año de nacimiento. Luego resta un año si hoy es más temprano que el cumpleaños (piénselo, su edad aumenta durante el año, en su cumpleaños)
Steve Goossens
0

Puede usar esto para la restricción de edad en su formulario:

function dobvalidator(birthDateString){
    strs = birthDateString.split("-");
    var dd = strs[0];
    var mm = strs[1];
    var yy = strs[2];

    var d = new Date();
    var ds = d.getDate();
    var ms = d.getMonth();
    var ys = d.getFullYear();
    var accepted_age = 18;

    var days = ((accepted_age * 12) * 30) + (ms * 30) + ds;
    var age = (((ys - yy) * 12) * 30) + ((12 - mm) * 30) + parseInt(30 - dd);

    if((days - age) <= '0'){
        console.log((days - age));
        alert('You are at-least ' + accepted_age);
    }else{
        console.log((days - age));
        alert('You are not at-least ' + accepted_age);
    }
}
IshaniNet
fuente
0

Llegué demasiado tarde, pero descubrí que esta es la forma más sencilla de calcular una fecha de nacimiento.

$(document).ready(init);

function init()
{
  writeYears("myage", 0, Age());
  $(".captcha").click(function()
  {
    reloadCaptcha();
  });

}

function Age()
{
    var birthday = new Date(1997, 02, 01),  //Year, month, day.
        today = new Date(),
        one_year = 1000*60*60*24*365;
    return Math.floor( (today.getTime() - birthday.getTime() ) / one_year);
}

function writeYears(id, current, maximum)
{
  document.getElementById(id).innerHTML = current;

  if (current < maximum)
  {
    setTimeout( function() { writeYears(id, ++current, maximum); }, Math.sin( current/maximum ) * 200 );
    }
}

La etiqueta HTML:

<span id="myage"></span>

Esperemos que esto ayude.

TWDbag
fuente
-1

Aquí está la solución más simple y precisa que se me ocurrió:

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    return ~~((date.getFullYear() + date.getMonth() / 100
    + date.getDate() / 10000) - (this.getFullYear() + 
    this.getMonth() / 100 + this.getDate() / 10000));
}

Y aquí hay una muestra que considerará el 29 de febrero -> 28 de febrero al año.

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    var feb = (date.getMonth() == 1 || this.getMonth() == 1);
    return ~~((date.getFullYear() + date.getMonth() / 100 + 
        (feb && date.getDate() == 29 ? 28 : date.getDate())
        / 10000) - (this.getFullYear() + this.getMonth() / 100 + 
        (feb && this.getDate() == 29 ? 28 : this.getDate()) 
        / 10000));
}

¡Incluso funciona con edad negativa!

wizulus
fuente
Como todos los demás, piensa que 2000-02-29 a 2001-02-28 es cero años.
RobG
He actualizado mi respuesta para acomodar el caso límite del año bisiesto. Gracias @RobG
wizulus
-1

Otra solución más:

/**
 * Calculate age by birth date.
 *
 * @param int birthYear Year as YYYY.
 * @param int birthMonth Month as number from 1 to 12.
 * @param int birthDay Day as number from 1 to 31.
 * @return int
 */
function getAge(birthYear, birthMonth, birthDay) {
  var today = new Date();
  var birthDate = new Date(birthYear, birthMonth-1, birthDay);
  var age = today.getFullYear() - birthDate.getFullYear();
  var m = today.getMonth() - birthDate.getMonth();
  if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
    age--;
  }
  return age;
}
xexsus
fuente
-1

Con el método momentjs "fromNow", esto le permite trabajar con fecha formateada, es decir: 15/03/1968

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");

//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";

Como una versión prototipo

String.prototype.getAge = function() {
return moment(this.valueOf()).fromNow(true).replace(" years", "");

}

Nicolas Giszpenc
fuente