Descobrindo a idade através da data de nascimento

Prefácio

De volta à ativa, próximo ao primeiro aniversário do PHPit, continuo com aquela proposta de artigos com pequenas dicas.
Hoje falaremos sobre um assunto que já foi levantado em diversos fóruns web adentro.

Conceito

Algumas vezes você pode necessitar descobrir a idade exata do seu usuário. As vezes ele acaba sendo barrado, apesar de ter a idade correta, mas pelo fato de ele ter completado a idade necessária no ano corrente, acabamos por restringir um usuário que deveria ter acesso.

A idéia básica nesse script é encontrar a timestamp de hoje, a timestamp do nascimento do fulano, subtrair um do outro, dividir pelos 60 segundos, pelos 60 minutos, pelas 24 horas e pelos 365.25 dias do ano. (Ufa!)

Mas aí você me pergunta: “Peraí! 365.25 dias do ano?!”.

Lembra-se dos anos bissextos? (Rápida aula de história :P)
Em 238 a.C., lá no Egito, durante a monarquia de Ptolomeu III, foi decretada a adição de 1 dia a cada 4 anos, pra compensar a diferença que existia entre o ano do calendário e o ano solar. Depois aconteceram diversos fatos, que não vêm ao caso agora, e finalmente foi dada origem ao que provavelmente é a maior gambiarra da história: o ano bissexto. Por isso cada ano teria aproximadamente 365.25 (por causa do 1/4 de dia que fica sobrando)…

Bom… Está respondida a pergunta, então..

Mão na massa

Vamos supor que temos apenas a data, no formato brasileiro…

<?php

    // Declara a data! :P
    $data = '29/08/2008';
   
    // Separa em dia, mês e ano
    list($dia, $mes, $ano) = explode('/', $data);
   
    // Descobre que dia é hoje e retorna a unix timestamp
    $hoje = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
    // Descobre a unix timestamp da data de nascimento do fulano
    $nascimento = mktime( 0, 0, 0, $mes, $dia, $ano);
   
    // Depois apenas fazemos o cálculo já citado :)
    $idade = floor((((($hoje - $nascimento) / 60) / 60) / 24) / 365.25);

    print $idade;

?>

Conclusão

Há outros métodos de se fazer isso, mas esse é um dos mais simples, pois utiliza apenas cálculos e não vários IFs.

Espero que tenham gostado! :)

E preparem-se para novidades no primeiro aniversário do PHPit!

Abraços!

  • vitor hugo

    muito boa a dica amigo…

    a proposito, dia 29/08 que vc usou no exemplo é meu nascimento

    abracos

  • Bruno

    Muito bom. Só faltou encapsular numa função adicionando alguns recursos a mais, como identificação do formato (brasileiro, americano ou banco de dados) e separador (ponto, traço, barra…)

  • Adorei muito este artigo, ajudou muito….

  • oIEE sOU a CAROLINNE DE 13 ANOS ISSO QER DIZER QER EU NASCI EM 1997OU 1996 QERO DESCUBRI OBRIGADA

  • Rafael, eu faço esse cálculo com um único IF e sem a necessidade de tantas operações de divisão. Veja em:
    http://rubsphp.blogspot.com/2011/04/funcao-para-c

  • Versão alternativa:

    <code>

    /**

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

    }

    </code>

  • Gabriela

    Excelente post!! Estva precisando de algo simples assim. Parabéns.

  • Excelente! Sem mais.

  • Ricardo

    Perfeito! Muito obrigado.

  • Bruno Campos

    Sensacional o post Rafael! Dentre tantas funções miraculosas da internet, enfim alguém postou uma muito bem pensada como a sua!

  • Edson Costa

    Muito bom esse post! parabens, achei o que procurava, aqui no blog tem outro post que fale sobre conta as horas que passaram ou menutos, estilo o facebook tem ele nos mostra quanto tempo a pessoa curtiu seu post! alguem pode me ajuda?

  • Aparecido Santos

    com faço para mostrar pelo ano – Exemplo, uma empresa foi criado no ano de 2011 – eu Gostaria de mostrar quantos anos ela tem de existência no ano atual.

    • Não seria só calcular a diferença entre o ano atual e o de criação?

      • Aparecido Santos

        Deu certo. Obrigado.

  • Excelente, Rafael Jaques! Eu usei aqui. Muito obrigado! Abraço.

  • Gerson

    Valeu fera, peguei só a conta. Me poupou algum tempo.