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);
javascript
date
Francisc
fonte
fonte
Date
objeto teria que fazer se o encapsulasse. As pessoas poderiam escrever livros sobre a insensatez do manuseio de JSDate
. ... 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.Respostas:
Eu iria para a legibilidade:
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
fonte
Tente isso.
Eu acredito que a única coisa que parecia grosseira no seu código foi a
substr
parte.Fiddle : http://jsfiddle.net/codeandcloud/n33RJ/
fonte
Importante: esta resposta não fornece uma resposta 100% precisa, ela fica desativada em cerca de 10 a 20 horas, dependendo da data.
É 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:
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! :-)
fonte
dateString
argumento correto para o construtor Date () analisá-lo corretamente. Por exemplo, tomando oYYYYMMDD
formato que eu dei na pergunta, ele falhará.Com momentjs:
fonte
Limpe a solução de uma linha usando o ES6:
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.
fonte
const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Há algum tempo, fiz uma função com esse objetivo:
Ele usa um objeto Date como entrada, portanto, é necessário analisar a
'YYYYMMDD'
sequência de datas formatada:fonte
birthDate
é 05 janeiro de 1980 , ea data atual é 04 de janeiro de 2005 , em seguida, a função irá relatar erroneamenteage
como 25 ... O valor correto a ser 24.Aqui está a minha solução, basta passar em uma data analisável:
fonte
Solução alternativa, porque porque não:
fonte
fonte
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.fonte
Eu acho que poderia ser simplesmente assim:
Funciona também com um carimbo de data / hora
fonte
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:
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.
fonte
Para obter a idade em que a data européia foi inserida:
fonte
Mais uma solução possível com o moment.js :
fonte
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.
fonte
Essa é a maneira mais elegante para mim:
fonte
Obter a idade (anos, meses e dias) da data de nascimento com javascript
Função calcularEdad (anos, meses e dias)
Função esNumero
fonte
Funciona perfeito para mim, pessoal.
fonte
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.
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.
fonte
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.
fonte
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.fonte
Mais duas opções:
fonte
Fiz algumas atualizações para uma resposta anterior.
Espero que ajude: D
fonte
Aqui está uma maneira simples de calcular a idade:
fonte
fonte
Você pode usar isso para restrição de idade em seu formulário -
fonte
Estou um pouco atrasado, mas achei a maneira mais simples de calcular uma data de nascimento.
A tag HTML:
Espero que isso ajude.
fonte
Aqui está a solução mais simples e precisa que eu poderia encontrar:
E aqui está uma amostra que considerará 29 de fevereiro -> 28 de fevereiro por ano.
Até funciona com idade negativa!
fonte
Mais uma solução:
fonte
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
}
fonte