Calcular a idade com base na data de nascimento no formato AAAAMMDD

285

Como posso calcular uma idade em anos, dada a data de nascimento no formato AAAAMMDD? É possível usar a Date()função?

Estou procurando uma solução melhor do que a que estou usando agora:

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
fonte
Lembre-se de sua formatação, não faça da maneira que você fez; apenas indente seu código com 4 espaços usando o botão de código (010101) ou Ctrl-K.
Marcel Korpel
Eu fiz, mas ele não funciona no IE9 Beta, então tive que fazê-lo manualmente.
Francisc
4
Sua solução original é melhor, no cálculo da idade, do que as respostas atuais. A resposta de Júlio Santos é essencialmente a mesma coisa. As outras respostas fornecem resultados imprecisos sob muitas condições e podem ser menos diretas ou menos eficientes.
Brock Adams
Obrigado Brock. Eu esperava que houvesse uma maneira mais elegante de fazer isso do que aquilo que parece um pouco bruto.
Francisc
4
@Francisc, é bruto, mas é o que o Dateobjeto teria que fazer se o encapsulasse. As pessoas poderiam escrever livros sobre a insensatez do manuseio de JS Date. ... Se você pode conviver algumas vezes com um dia de folga, então a aproximação: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )é o mais simples possível.
Brock Adams

Respostas:

245

Eu iria para a legibilidade:

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);
}

Isenção de responsabilidade: isso também tem problemas de precisão, portanto também não pode ser totalmente confiável. Pode ser desativado por algumas horas, em alguns anos ou durante o horário de verão (dependendo do fuso horário).

Em vez disso, eu recomendaria o uso de uma biblioteca para isso, se a precisão for muito importante. Além disso @Naveens post, é provavelmente o mais preciso, pois não depende da hora do dia.


Benchmarks: http://jsperf.com/birthday-calculation/15

André Snede Kock
fonte
3
Isso retorna 0 anos para datas como 2000-02-29 a 2001/02/28, quando ele provavelmente deve retornar 1.
RobG
16
@RobG Eu não acho que um ano inteiro tenha passado tecnicamente de 29-02-2002 a 28-02-200 2001, tornando sua resposta inválida. Não faria sentido, 28-02-2002 a 28-02 2001 é um ano; portanto, 29-02-2002 a 28-02-2002, deve ser inferior a um ano.
André Snede Kock 22/03
3
Você não detalhou o que "não é preciso" significa, pensei que informações adicionais poderiam ser úteis. Você pode consertar os problemas ou excluir a resposta.
RobG
1
@RobG Na verdade eu fiz. Também apontei para uma solução melhor que a minha. Minha solução resolve o problema de uma maneira fácil de ler, com pequenos problemas de precisão, mas dentro dos limites de sua finalidade.
André Snede Kock
1
Resposta adorável @ AndréSnedeHansen e rápido também, já que você não tem essa divisão louca, como está presente na minha resposta ;-) +1 por legibilidade e velocidade.
Kristoffer Dorph
506

Tente isso.

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;
}

Eu acredito que a única coisa que parecia grosseira no seu código foi a substrparte.

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

naveen
fonte
Você pode dar um exemplo de uso? Não consegui fazê-lo funcionar sem modificar a função para receber três argumentos separados, como: getAge (y, m, d). Por exemplo: jsbin.com/ehaqiw/1/edit
edt
Como muitos outros, isso pensa que 29/02/2002 a 28-02-200 2001 é zero ano, quando provavelmente deve ser 1 (já que 01-01-2001 deve ser 1 ano 1 dia).
`` #
3
@RobG: quando os filhotes 'comemoram' (a resposta comum a essa pergunta realmente parece ser: 'o fim de semana mais próximo da data real'), seu dia de nascimento varia de acordo com o contexto, incluindo: região geográfica (inglês simples: onde você mora ), LEI (não subestime essa), religião e preferência pessoal (incluindo comportamento de grupo): alguns motivos: "eu nasci em fevereiro", outros motivos: "eu nasci depois de 28 de fevereiro" (o que é mais comum em 1º de março) en.wikipedia.org/wiki/February_29 Por tudo isso, esse algo está correto SE 1º de março é o resultado mais
rápido de que
3
@RobG: A fossa de 'mais x mês (s)' é irrelevante para a noção humana de idade em anos. A noção humana comum é que a contagem de idade (InYears) aumenta todos os dias (independentemente da hora) quando o calendário tem o mesmo mês # e dia # (em comparação com a data de início): de modo que 28-02-2002 a 2001-02 -27 = 0 anos e 28-02-2002 a 28-02 2001 = 1 ano. Estendendo esse 'senso comum' aos folhetos: 29-02-2002 (o dia após 28-02-02) para 28-02 2001 = zero anos . Meu comentário apenas afirmou que o algo respondido sempre dá a resposta humana "correta" SE alguém espera / concorda com essa lógica para os saltos.
GitaarLAB 17/03
3
@ RobG: Eu nunca disse que eu ou a resposta estava universalmente correta (TM). Incluí noção de contextos / jurisdições / visões. Ambos os meus comentários incluem claramente um IF maiúsculo (para o manuseio dos resultados de exceção). De fato, meu primeiro comentário afirmou exatamente o que eu pretendia dizer e nunca incluiu nenhum julgamento em relação ao certo ou errado. De fato, meus comentários esclarecem o que e o que não esperar (e por que) dessa resposta (como você chama de "destaque as questões"). Ps: 31 de fevereiro?!?
GitaarLAB 17/03
72

Importante: esta resposta não fornece uma resposta 100% precisa, ela fica desativada em cerca de 10 a 20 horas, dependendo da data.

Não há soluções melhores (de qualquer maneira, não nessas respostas). - naveen

É claro que não pude resistir ao desejo de aceitar o desafio e criar uma calculadora de aniversários mais rápida e mais curta do que a atual solução aceita. O ponto principal da minha solução é que a matemática é rápida, portanto, em vez de usar ramificação, e o modelo de data que o javascript fornece para calcular uma solução, usamos a maravilhosa matemática

A resposta é a seguinte e é cerca de 65% mais rápida que a naveen, além de ser muito mais curta:

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

O número mágico: 31557600000 é 24 * 3600 * 365,25 * 1000 Qual é a duração de um ano, a duração de um ano é 365 dias e 6 horas, ou seja, 0,25 dia. No final, piso o resultado que nos dá a idade final.

Aqui estão os benchmarks: http://jsperf.com/birthday-calculation

Para suportar o formato de dados do OP, você pode substituir +new Date(dateString);
por+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Se você pode encontrar uma solução melhor, compartilhe! :-)

Kristoffer Dorph
fonte
Essa é uma solução muito legal. O único problema que vejo é o dateStringargumento correto para o construtor Date () analisá-lo corretamente. Por exemplo, tomando o YYYYMMDDformato que eu dei na pergunta, ele falhará.
Francisc
22
Esta resposta tem um erro. Defina seu relógio para 12:01. Às 12h01, se você calcular ('2012-03-27') (data de hoje), receberá uma resposta zero, mesmo que seja igual a 1. Esse bug existe durante toda a hora das 12h. Isso ocorre devido à declaração incorreta de que um ano possui 365,25 dias. Isso não. Estamos lidando com anos civis, não com a duração da órbita da Terra (que é mais precisamente 365.256363 dias). Um ano tem 365 dias, exceto um ano bissexto que tem 366 dias. Além disso, o desempenho em algo assim não faz sentido. A manutenção é muito mais importante.
precisa
1
Obrigado pela sua solução Kristoffer. Posso perguntar o que o + novo faz em comparação com apenas novo, e também os dois til (~) no retorno?
30513 Frank Jensen
1
@FrankJensen Hi Frank, eu estava curioso demais e acharam esta resposta: convertidos duplas til flutuar para inteiros Greetings
Stano
1
@FrankJensen essencialmente o til inverte o número (o valor binário) enquanto converte float em número inteiro (pavimentado); portanto, dois til fornecem o número arredondado. O + na frente de novo Date () converte o objeto na representação inteira do objeto de data; isso também pode ser usado com cadeias de números, por exemplo + '21 '=== 21
Kristoffer Dorph
55

Com momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
Vitor Tyburski
fonte
2
@RicardoPontual, isso requer momentos, então não pode ser a melhor resposta.
itzmukeshy7
13
@ itzmukeshy7 de fato, uma resposta para ser o melhor, deve, pelo menos, exigem jQuery;)
thomaux
@thomaux Depende totalmente do ambiente de desenvolvimento!
precisa saber é o seguinte
@ itzmukeshy7 relaxar, que é uma piada;) veja: meta.stackexchange.com/a/19492/173875
thomaux
2
@thomaux eu sabia que ele é uma piada;)
itzmukeshy7
38

Limpe a solução de uma linha usando o 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

Estou usando um ano de 365,25 dias (0,25 por causa de anos bissextos) que são 3.15576e + 10 milissegundos (365,25 * 24 * 60 * 60 * 1000), respectivamente.

Lucas Janon
fonte
1
Bastante arrumado - você poderia elaborar o que o 3.15576e + 10 significa?
Leonheess 15/07/19
1
Sim, seria bom adicionar a seguinte linha antes da função:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon 15/07/19
12

Há algum tempo, fiz uma função com esse objetivo:

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;
}

Ele usa um objeto Date como entrada, portanto, é necessário analisar a 'YYYYMMDD'sequência de datas formatada:

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
fonte
Ah, sim, eu perdi o ano bissexto. Obrigado.
Francisc
1
Isso fornece valores inválidos para combinações de datas selecionadas! Por exemplo, se o birthDateé 05 janeiro de 1980 , ea data atual é 04 de janeiro de 2005 , em seguida, a função irá relatar erroneamente agecomo 25 ... O valor correto a ser 24.
Brock Adams
@BrockAdams Por que isso? Estou tendo esse problema no momento. Obrigado.
Jack H
@VisionIncision, porque não lida corretamente com as condições da borda. Acredite ou não, o código da pergunta é a melhor abordagem - embora pareça que uma das respostas posteriores o tenha reembalado de maneira mais adequada.
Brock Adams
CMS Oi :-) Eu escrevi esta pergunta ( stackoverflow.com/questions/16435981/… ) e me disseram que se eu quiser uma resposta 100% precisa, devo verificar todos os anos - se é um ano bissexto e depois calcular o último fração. (veja a resposta de Guffa). Sua função (parte dela) faz isso . mas como posso usá-lo para calcular a idade com 100% de precisão? o DOB ​​raramente começa em 1/1 / aaaa ..... então como posso usar sua função para calcular a idade exata?
Royi Namir
10

Aqui está a minha solução, basta passar em uma data analisável:

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
fonte
7

Solução alternativa, porque porque não:

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
fonte
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
fonte
Graças fácil encontrar idade em anos meses e dias
Sumit Kumar Gupta
5

Para testar se o aniversário já passou ou não, defino uma função auxiliar Date.prototype.getDoY, que efetivamente retorna o número do dia do ano. O resto é bastante auto-explicativo.

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
fonte
Isso fornece resultados imprecisos em anos bissextos, para aniversários após 28 de fevereiro. Ele envelhece essas pessoas em 1 dia. EG: para DoB = 2001/07/04 , essa função retornará 7 anos, em 03/07/2008 .
Brock Adams
@Brock: Obrigado. Se não me engano, corrigi esse comportamento errado.
Marcel Korpel
Sim, acho que você pode ter (não testado rigorosamente, apenas analisado). Mas observe que a nova solução não é mais simples e mais elegante que a solução do OP (sem contar que esta está adequadamente encapsulada em uma função). ... A solução do OP é mais fácil de entender (portanto, auditar, testar ou modificar). Às vezes, simples e direto é o melhor, IMO.
Brock Adams
@Brock: Concordo plenamente: tenho que pensar no que essa função faz e isso nunca é uma coisa boa.
Marcel Korpel
Não deveria "if (doyNow <doyBirth)" ser "if (doyNow <= doyBirth)"? Em todos os meus testes, o dia foi encerrado em uma e isso foi corrigido.
Ted Kulp
5

Eu acho que poderia ser simplesmente assim:

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 também com um carimbo de data / hora

age(403501000000)
//34
romuleald
fonte
Este código calculará uma pessoa com a mesma idade o ano todo. No seu exemplo, se hoje fosse '09 / 19 / 2018' o código daria 37, mas a idade (um dia antes do aniversário) seria 36 ...
Steve Goossens
4

Eu apenas tive que escrever essa função para mim - a resposta aceita é razoavelmente boa, mas a IMO poderia usar alguma limpeza. Isso leva um timestamp unix para dob porque esse era meu requisito, mas poderia ser rapidamente adaptado para usar uma string:

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 usei um valor fixo de 31 na minha função measureDays. Todo o cálculo se preocupa é que o "dia do ano" seja uma medida monotonicamente crescente do registro de data e hora.

Se estiver usando um carimbo de data / hora javascript, obviamente você desejará remover o fator 1000.

Keith Nordstrom
fonte
n é indefinido. Eu acho que você quer dizer 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 obter a idade em que a data européia foi inserida:

getAge('16-03-1989')
Martijn van Hoof
fonte
Obrigado pela sua sugestão em stackoverflow.com/a/13367162/1055987 boa captura.
JFK #
3

Mais uma solução possível com o 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
fonte
2

Eu verifiquei os exemplos mostrados antes e eles não funcionaram em todos os casos, e por causa disso eu criei um script próprio. Eu testei isso e funciona perfeitamente.

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
fonte
O período de 2000-02-29 a 2001-02-28 deve ser de um ano? Se assim for, então o acima não é perfeito. :-)
RobG 21/03
2

Essa é a maneira mais elegante para mim:

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
fonte
1

Obter a idade (anos, meses e dias) da data de nascimento com javascript

Função calcularEdad (anos, meses e dias)

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";
    }

Função 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
fonte
1

Funciona perfeito para mim, pessoal.

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

Eu sei que esse é um tópico muito antigo, mas eu queria colocar nesta implementação que escrevi para descobrir a idade que acredito ser muito mais 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 ) ;
}

Claro que você pode adaptar isso para caber em outros formatos de obtenção dos parâmetros. Espero que isso ajude alguém que procura uma solução melhor.

ganaraj
fonte
0

Eu usei essa abordagem usando lógica em vez de matemática. É preciso e rápido. Os parâmetros são o ano, mês e dia do aniversário da pessoa. Retorna a idade da pessoa como um número inteiro.

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
fonte
cordas ou objetos data de entrada de acordo com OP
nazim
0

Adotando os posts do naveen e do OP original, acabei com um stub de método reutilizável que aceita strings e / ou objetos JS Date.

Eu o nomeei gregorianAge()porque esse cálculo fornece exatamente como denotamos idade usando o calendário gregoriano. isto é, sem contar o ano final se mês e dia forem anteriores ao mês e dia do ano de nascimento.

/**
 * 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
fonte
0

Mais duas opções:

// 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
fonte
0

Fiz algumas atualizações para uma resposta anterior.

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 ajude: D

Fabricio
fonte
0

Aqui está uma maneira simples de calcular a idade:

//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
fonte
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
fonte
Faz uma diferença simples de ano entre agora e o ano de nascimento. Em seguida, ele subtrai um ano se hoje é no início do ano que o aniversário (pensar sobre isso, sua idade sobe durante o ano, em seu aniversário)
Steve Goossens
0

Você pode usar isso para restrição de idade em seu formulário -

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
fonte
0

Estou um pouco atrasado, mas achei a maneira mais simples de calcular uma data de nascimento.

$(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 );
    }
}

A tag HTML:

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

Espero que isso ajude.

TWDbag
fonte
-1

Aqui está a solução mais simples e precisa que eu poderia encontrar:

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));
}

E aqui está uma amostra que considerará 29 de fevereiro -> 28 de fevereiro por ano.

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));
}

Até funciona com idade negativa!

wizulus
fonte
Como todos os outros, ele acha que 29/02/2002 a 28-02 2001 são zero anos.
`` #
Atualizei minha resposta para acomodar o caso do ano bissexto. Obrigado @RobG
wizulus 22/03
-1

Mais uma solução:

/**
 * 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
fonte
-1

Com o método momentjs "fromNow", permite trabalhar com data formatada, ou seja: 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 uma versão protótipo

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

}

Nicolas Giszpenc
fonte