Imaginei que eu jogaria isso aqui, já que essa parece ser a forma mais popular dessa questão.
Eu fiz uma comparação de 100 anos em três dos tipos mais populares de funções de idade que eu poderia encontrar para PHP e postei meus resultados (assim como as funções) no meu blog .
Como você pode ver lá , todas as 3 funções são pré-formadas com uma pequena diferença na 2ª função. Minha sugestão com base nos meus resultados é usar a 3ª função, a menos que você queira fazer algo específico no aniversário de uma pessoa; nesse caso, a 1ª função fornece uma maneira simples de fazer exatamente isso.
Encontrou um pequeno problema com o teste e outro problema com o segundo método! Atualização em breve no blog! Por enquanto, notei que o segundo método ainda é o mais popular que eu encontro on-line, e ainda o que eu encontro com as mais imprecisões!
Minhas sugestões após minha revisão de 100 anos:
Se você quiser algo mais alongado para incluir ocasiões como aniversários e outras coisas:
function getAge($date) { // Y-m-d format
$now = explode("-", date('Y-m-d'));
$dob = explode("-", $date);
$dif = $now[0] - $dob[0];
if ($dob[1] > $now[1]) { // birthday month has not hit this year
$dif -= 1;
}
elseif ($dob[1] == $now[1]) { // birthday month is this month, check day
if ($dob[2] > $now[2]) {
$dif -= 1;
}
elseif ($dob[2] == $now[2]) { // Happy Birthday!
$dif = $dif." Happy Birthday!";
};
};
return $dif;
}
getAge('1980-02-29');
Mas se você simplesmente quer saber a idade e nada mais, então:
function getAge($date) { // Y-m-d format
return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}
getAge('1980-02-29');
Uma observação importante sobre o strtotime
método:
Note:
Dates in the m/d/y or d-m-y formats are disambiguated by looking at the
separator between the various components: if the separator is a slash (/),
then the American m/d/y is assumed; whereas if the separator is a dash (-)
or a dot (.), then the European d-m-y format is assumed. If, however, the
year is given in a two digit format and the separator is a dash (-, the date
string is parsed as y-m-d.
To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or
DateTime::createFromFormat() when possible.
mktime()
. parece php calculou malstrtotime()
com esse formato.