169 votes

PHP calculer l'âge

Je cherche un moyen de calculer l'âge d'une personne, compte tenu de sa date de naissance au format jj/mm/aaaa.

J'utilisais la fonction suivante, qui a bien fonctionné pendant plusieurs mois, jusqu'à ce qu'une sorte de problème fasse en sorte que la boucle while ne se termine jamais et que le site entier s'arrête. Étant donné qu'il y a près de 100 000 DOBs qui passent par cette fonction plusieurs fois par jour, il est difficile de déterminer la cause de ce problème.

Quelqu'un a-t-il une méthode plus fiable pour calculer l'âge ?

//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();

$age = 0;
while( $tdate > $dob = strtotime('+1 year', $dob))
{
    ++$age;
}
return $age;

EDIT : cette fonction semble fonctionner correctement dans certains cas, mais elle renvoie "40" pour une date de naissance du 14/09/1986.

return floor((time() - strtotime($birthdayDate))/31556926);

204voto

Sudhir Points 50854

Cela fonctionne bien.

<?php
  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate = "12/17/1983";
  //explode the date to get month, day and year
  $birthDate = explode("/", $birthDate);
  //get age from date or birthdate
  $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
    ? ((date("Y") - $birthDate[2]) - 1)
    : (date("Y") - $birthDate[2]));
  echo "Age is:" . $age;
?>

1 votes

D'accord, parfois pour ce format nous devons utiliser mktime() . il semblerait que php ait mal calculé les strtotime() avec ce format.

31 votes

PHP strtotime comprend parfaitement les formats de date, vous n'avez pas à vous inquiéter : 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. php.net/manual/fr/function.strtotime.php

0 votes

Cette fonction est vraiment plus coûteuse que les autres solutions. Cela vient de l'utilisation excessive de la fonction date().

179voto

salathe Points 26305
$tz  = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
     ->diff(new DateTime('now', $tz))
     ->y;

À partir de PHP 5.3.0, vous pouvez utiliser l'option pratique DateTime::createFromFormat pour s'assurer que votre rendez-vous ne soit pas confondu avec m/d/Y et le format DateInterval (via DateTime::diff ) pour obtenir le nombre d'années entre maintenant et la date cible.

1 votes

Cela semble prometteur, mais malheureusement la plupart des serveurs d'hébergement dans mon pays utilisent toujours PHP 5.2.x :(

3 votes

A-t-il vraiment besoin d'un fuseau horaire ?

135voto

Wernight Points 6086
 $date = new DateTime($bithdayDate);
 $now = new DateTime();
 $interval = $now->diff($date);
 return $interval->y;

0 votes

J'ai essayé d'utiliser DateTime() avant mais cela gèle le script. Dans mes journaux, je vois PHP Warning : date() : Il n'est pas sûr de se fier aux paramètres de fuseau horaire du système, même lorsque j'ajoute date_default_timezone_set('Europe/Bruxelles') ;

1 votes

Tu es sûr d'avoir enlevé le # avant cette ligne ? Vous devez le définir dans PHP.ini

0 votes

Il est généralement prudent d'ignorer cet avertissement (surtout dans ce cas).

111voto

Andrey Korchak Points 384

J'utilise Date/Time pour cela :

$age = date_diff(date_create($bdate), date_create('now'))->y;

0 votes

Vous pouvez utiliser quelque chose comme ceci pour les formats de date de style britannique : $age = date_diff(date_create(str_replace('/', '.', $bdate)), date_create('now'))->y ; car de stackoverflow.com/questions/4163641/

67voto

Mike Points 181

Méthode simple pour calculer l'âge à partir du db :

$_age = floor((time() - strtotime('1986-09-16')) / 31556926);

31556926 est le nombre de secondes dans une année.

16 votes

Utilisation excessive des fonctions... $_age = floor((time() - strtotime('1986-09-16')) / 31556926);

4 votes

La meilleure solution ... 1 liner, simple et facile à utiliser : mktime

1 votes

@RobertM. Est-ce si grave dans ce cas ? Je ne pense pas que ces fonctions soient si complexes ou "lourdes".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X