Função para calcular idade

Artigo que apresenta uma função simples e objetiva em PHP e em JavaScript para se calcular a idade a partir da data de nascimento.

Bolo de Aniversário

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

Mateus disse...

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.

Sérgio Wilker disse...

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.

Anônimo disse...

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á.

Rubens Takiguti Ribeiro (autor do blog) disse...

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

Rubens Takiguti Ribeiro (autor do blog) disse...

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

Anônimo disse...

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

Rubens Takiguti Ribeiro (autor do blog) disse...

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

Anônimo disse...

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!