Je pensais que je jetterais ceci ici car cela semble être la forme la plus populaire de cette question.
J'ai effectué une comparaison de 100 ans sur 3 des types de fonctions d'âge les plus populaires que j'ai pu trouver pour PHP et j'ai publié mes résultats (ainsi que les fonctions) sur mon blog .
Comme vous pouvez le voir là - bas , les 3 funcs préforme bien avec juste une légère différence sur la 2ème fonction. Ma suggestion basée sur mes résultats est d'utiliser la 3ème fonction à moins que vous ne souhaitiez faire quelque chose de spécifique le jour de l'anniversaire d'une personne, auquel cas la 1ère fonction fournit un moyen simple de faire exactement cela.
J'ai trouvé un petit problème avec le test et un autre problème avec la 2ème méthode! Mise à jour à venir sur le blog bientôt! Pour l'instant, je prends note que la 2ème méthode est toujours la plus populaire que je trouve en ligne, et pourtant celle avec laquelle je trouve le plus d'inexactitudes!
Mes suggestions après mon bilan de 100 ans:
Si vous voulez quelque chose de plus allongé pour pouvoir inclure des occasions comme les anniversaires et autres:
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');
Mais si vous voulez simplement connaître l'âge et rien de plus, alors:
function getAge($date) { // Y-m-d format
return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}
getAge('1980-02-29');
Une note clé sur la strtotimeméthode:
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(). il semble que php a mal calculé lestrtotime()avec ce format.