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


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


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/


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! :-)


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')

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.


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

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
}

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

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

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

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

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.


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')

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

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

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


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

1

Funciona perfeito para mim, pessoal.

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

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.


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

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>


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

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


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

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

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

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.


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


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

-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", "");

}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.