Como hoje é meu aniversário, segue uma função em PHP para calcular a idade a partir de uma data de nascimento.
/** * Calcula a idade a partir de uma data de nascimento e o dia atual * @param int $dia Dia de nascimento * @param int $mes Mes de nascimento * @param int $ano Ano de nascimento * @return int Idade calculada */ function calcular_idade($dia, $mes, $ano) { $hoje = getdate(); $idade = $hoje['year'] - $ano; if ($hoje['mon'] < $mes || ($hoje['mon'] == $mes && $hoje['mday'] < $dia)) { $idade -= 1; } return $idade; }
Basta informar o dia, mês e ano de nascimento, que ele devolve um inteiro representando a idade.
Caso você tenha a data em algum formato pré-definido, como o formato brasileiro ou o formato de um banco de dados, você precisa primeiro extrair as informações desejadas. Veja dois exemplos abaixo de como fazer isso:
$data_br = '24/04/1984'; sscanf($data_br, '%d/%d/%d', $dia, $mes, $ano); $data_bd = '1984-04-24'; sscanf($data_bd, '%d-%d-%d', $ano, $mes, $dia);
Se você está acostumado com a função explode, também funcionaria, mas acredito que a forma acima seja mais simples e correta, já que devolve os valores na forma de inteiro.
Para quem gostaria do código em JavaScript, segue uma versão adaptada, que utiliza a classe Date do JavaScript:
/** * Calcula a idade a partir de uma data de nascimento * @param int dia Dia de nascimento * @param int mes Mes de nascimento * @param int ano Ano de nascimento * @return int Idade calculada */ function calcular_idade(dia, mes, ano) { var hoje = new Date(); var idade = hoje.getFullYear() - ano; if (hoje.getMonth() + 1 < mes || (hoje.getMonth() + 1 == mes && hoje.getDate() < dia)) { idade--; } return idade; }
12 comentários
Parabéns.
Obrigado ! foi muito útil .
Legal!
agora acho uma coisa se o if ficasse assim:if ($hoje['mon'] != $mes || $hoje['mday'] != $dia)
não ficaria melhor não? com mais Lógico.
Você Não teria um javascript que informasse isso, tipo, só bastasse eu colocar a data do meu nascimento e o javascript interpretar em anos.
EX:
31.08.199X
E O javascript mostrasse
X Anos
e de acordo com anos se passando os anos do javascript alterasse automaticamente.
Olá, Sérgio
Coloquei uma versão em JavaScript no final do post. Você só precisa quebrar a data em dia, mês e ano e passar para a função.
Muito legal a função!
Rubens, eu precisaria dela pra uma outra finalidade, que mostrasse também os meses, exe: 3,3 , ou seja, e anos e 3 meses, e no caso tiver menos de 1 ano, 0,8, ou seja, 8 meses. Tentei fazer algumas mudanças na função mas não deu muito certo!
Obrigado desde já.
Olá, Anônimo
Neste caso, talvez seja mais fácil usar as classes DateTime e DateInterval:
function calcular_idade($dia, $mes, $ano) {
$data = new DateTime(sprintf('%04d-%02d-%2d 00:00:00', $ano, $mes, $dia));
$hoje = new DateTime(strftime('%Y-%m-%d 00:00:00'));
$diferenca = $hoje->diff($data);
return $diferenca->format('%Y.%m');
}
Anônimo, mais uma observação:
A função retorna uma string. Ela pode retornar "20.1" ou "20.10", que são valores diferentes. Embora estes valores, no formato float, representam o mesmo valor.
Para retornar "20.01" para "20 anos e 1 mês" e "20.10" para "20 anos e 10 meses", você precisa alterar a linha $diferenca->format('%Y.%m') para $diferenca->format('%Y.%M')
Então Rubens, tentei usar o script q vc passou mas, deu um erro,veja:
Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (1984-10- 7 00:00:00) at position 7 (-): Unexpected character' in E:\Arquivos de programas\xampp\htdocs\do\teste.php:11 Stack trace: #0 E:\Arquivos de programas\xampp\htdocs\do\teste.php(11): DateTime->__construct('1984-10- 7 00:0...') #1 E:\Arquivos de programas\xampp\htdocs\do\teste.php(18): calcular_idade(7, 10, 1984) #2 {main} thrown in E:\Arquivos de programas\xampp\htdocs\do\teste.php on line 11
Anônimo, esqueci de colocar um zero na função. Teste com essa:
function calcular_idade($dia, $mes, $ano) {
$data = new DateTime(sprintf('%04d-%02d-%02d 00:00:00', $ano, $mes, $dia));
$hoje = new DateTime(strftime('%Y-%m-%d 00:00:00'));
$diferenca = $hoje->diff($data);
return $diferenca->format('%Y.%m');
}
Valeu Rubens, muito grato pela sua ajuda! Deu certinho! No caso a utilização deste script, é para calcular o tempo de casa de um colaborador, por isso q precisava q aparecesse os anos e meses, pq qd o funcionario tem menos de 1 ano, tem q mostrar os meses. Parabéns pelo seu blog, ja aprendi muito com ele! Como se diz, o conhecimento é multiplicado quando dividido!
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com