PHP calculer l'âge

160

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 fonctionnait bien pendant plusieurs mois jusqu'à ce qu'une sorte de pépin empêche la boucle while de ne jamais se terminer et arrête tout le site. Comme il y a près de 100 000 DOB qui utilisent cette fonction plusieurs fois par jour, il est difficile de déterminer ce qui en était la cause.

Quelqu'un a-t-il un moyen plus fiable de 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 de temps en temps, mais renvoie "40" pour une date de naissance du 14/09/1986

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

Réponses:

193

Cela fonctionne très 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;
?>
Sudhir Bastakoti
la source
1
D'accord, nous devons parfois utiliser ce format mktime(). il semble que php a mal calculé le strtotime()avec ce format.
GusDeCooL
30
PHP strtotimecomprend 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/en/function.strtotime.php
s3v3n
Cette fonction est vraiment plus coûteuse que les autres solutions. Cela vient de la surutilisation de la fonction date ().
Jarzon
Belle date au prorata. Merci
Roque Mejos
172
$tz  = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
     ->diff(new DateTime('now', $tz))
     ->y;

Depuis PHP 5.3.0, vous pouvez utiliser le handy DateTime::createFromFormatpour vous assurer que votre date ne soit pas confondue avec le m/d/Yformat et la DateIntervalclasse (via DateTime::diff) pour obtenir le nombre d'années entre maintenant et la date cible.

salathe
la source
1
Cela semble prometteur, mais malheureusement, la plupart des hébergements de serveurs de mon pays utilisent toujours PHP 5.2.x :(
GusDeCooL
3
A-t-il vraiment besoin d'un fuseau horaire?
André Chalella
127
 $date = new DateTime($bithdayDate);
 $now = new DateTime();
 $interval = $now->diff($date);
 return $interval->y;
Wernight
la source
J'ai essayé d'utiliser DateTime () avant mais cela gèle le script. Dans mes journaux, je vois PHP Avertissement: 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');
stef
1
Vous êtes sûr d'avoir supprimé le # avant cette ligne? Vous devriez définir cela dans PHP.ini
Wernight
Il est généralement prudent d'ignorer cet avertissement (surtout dans ce cas).
Wernight
96

J'utilise la date / heure pour cela:

$age = date_diff(date_create($bdate), date_create('now'))->y;
Andrey Korchak
la source
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; à cause de stackoverflow.com/questions/4163641/…
Richard
1
Solution la plus simple, une seule ligne. Fonctionne uniquement sur PHP 5.3+
Rhaymand Tatlonghari
60

Méthode simple pour calculer l'âge à partir de dob:

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

31556926 est le nombre de secondes par an.

Mike
la source
16
utilisation excessive des fonctions ...$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Mavelo
4
Meilleure solution ... 1 liner, simple et à éviter: mktime
Timmy
1
@RobertM. Est-ce si grave dans ce cas? Je ne pense pas que ces fonctions soient si complexes ou "lourdes"
Dewan159
1
@ Dewan159 regardez l'historique des modifications ... a été modifié pour correspondre à ma solution;)
Mavelo
4
Qu'en est-il des secondes intercalaires?
ksimka le
17

// Calculateur d'âge

function getAge($dob,$condate){ 
    $birthdate = new DateTime(date("Y-m-d",  strtotime(implode('-', array_reverse(explode('/', $dob))))));
    $today= new DateTime(date("Y-m-d",  strtotime(implode('-', array_reverse(explode('/', $condate))))));           
    $age = $birthdate->diff($today)->y;

    return $age;
}

$dob='06/06/1996'; //date of Birth
$condate='07/02/16'; //Certain fix Date of Age 
echo getAge($dob,$condate);
matinict
la source
5
Meilleure solution moderne 2016.
AlexioVay
14

Je trouve que cela fonctionne et c'est simple.

Soustraire de 1970 car strtotime calcule le temps à partir du 01/01/1970 ( http://php.net/manual/en/function.strtotime.php )

function getAge($date) {
    return intval(date('Y', time() - strtotime($date))) - 1970;
}

Résultats:

Current Time: 2015-10-22 10:04:23

getAge('2005-10-22') // => 10
getAge('1997-10-22 10:06:52') // one 1s before  => 17
getAge('1997-10-22 10:06:50') // one 1s after => 18
getAge('1985-02-04') // => 30
getAge('1920-02-29') // => 95
Travis Mark Chong
la source
Presque vrai ... strtotime () calcule le temps entre 1969-12-31 18:00:00
phoenix le
8

Si vous souhaitez calculer l'âge d'utilisation du dob, vous pouvez également utiliser cette fonction. Il utilise l'objet DateTime.

function calcutateAge($dob){

        $dob = date("Y-m-d",strtotime($dob));

        $dobObject = new DateTime($dob);
        $nowObject = new DateTime();

        $diff = $dobObject->diff($nowObject);

        return $diff->y;

}
hmoyat
la source
8

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

Voir BLOG


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.
SpYk3HH
la source
8

Vous pouvez utiliser la Carbonbibliothèque , qui est une extension d'API pour DateTime.

Vous pouvez:

function calculate_age($date) {
    $date = new \Carbon\Carbon($date);
    return (int) $date->diffInYears();
}

ou:

$age = (new \Carbon\Carbon($date))->age;
Broshi
la source
1
C'est une solution plus propre mais elle nécessite une bibliothèque externe qui n'est peut-être pas la meilleure pour chaque projet
stef
1
le carbone offre la propriété magique age, qui fait un diffInYears. Vous pouvez donc écrire:(new \Carbon\Carbon($date))->age
k0pernikus
4

Si vous n'avez pas besoin d'une grande précision, juste du nombre d'années, vous pouvez envisager d'utiliser le code ci-dessous ...

 print floor((time() - strtotime("1971-11-20")) / (60*60*24*365));

Il vous suffit de le mettre dans une fonction et de remplacer la date "1971-11-20" par une variable.

Veuillez noter que la précision du code ci-dessus n'est pas élevée à cause des années bissextiles, c'est-à-dire que tous les 4 ans environ, les jours sont 366 au lieu de 365. L'expression 60 * 60 * 24 * 365 calcule le nombre de secondes dans une année - vous pouvez remplacez-le par 31536000.

Une autre chose importante est qu'en raison de l'utilisation d' UNIX horodatage il présente à la fois le problème de l'année 1901 et de l'année 2038, ce qui signifie que l'expression ci-dessus ne fonctionnera pas correctement pour les dates avant l'année 1901 et après l'année 2038.

Si vous pouvez vivre avec les limitations mentionnées ci-dessus, ce code devrait fonctionner pour vous.

Neven Boyanov
la source
que se passera-t-il en 2038 "chaque système" plantera si utilise time ()?
Miguel
3
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();
return date('Y', $tdate) - date('Y', $dob);
Sergey Eremin
la source
1
Ça ne marche pas. Votre fonction indiquerait qu'une personne née le 1er septembre 1990 a le même âge qu'une personne née le 1er octobre 1990 - elle calculerait (2010 - 1990) = 20 pour les deux.
PaulJWilliams
de quelle précision d'âge avez-vous besoin? mois? journée?
Sergey Eremin
3
  function dob ($birthday){
    list($day,$month,$year) = explode("/",$birthday);
    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;
    if ($day_diff < 0 || $month_diff < 0)
      $year_diff--;
    return $year_diff;
  }
CristiC
la source
Cela semble correct à certaines dates, mais pour d'autres, il ne renvoie rien, probablement si le IF n'est pas satisfait?
stef
3

J'ai trouvé ce script fiable. Il prend le format de date AAAA-mm-jj, mais il pourrait être modifié assez facilement pour d'autres formats.

/*
* Get age from dob
* @param        dob      string       The dob to validate in mysql format (yyyy-mm-dd)
* @return            integer      The age in years as of the current date
*/
function getAge($dob) {
    //calculate years of age (input string: YYYY-MM-DD)
    list($year, $month, $day) = explode("-", $dob);

    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;

    if ($day_diff < 0 || $month_diff < 0)
        $year_diff--;

    return $year_diff;
}
Phil Lewis
la source
2
Veuillez détailler comment cela sera utile. Le simple fait de coller une fonction n'est pas une manière correcte de répondre.
Starx
3
$birthday_timestamp = strtotime('1988-12-10');  

// Calculates age correctly
// Just need birthday in timestamp
$age = date('md', $birthday_timestamp) > date('md') ? date('Y') - date('Y', $birthday_timestamp) - 1 : date('Y') - date('Y', $birthday_timestamp);
Dmitriy
la source
3

i18n:

function getAge($birthdate, $pattern = 'eu')
{
    $patterns = array(
        'eu'    => 'd/m/Y',
        'mysql' => 'Y-m-d',
        'us'    => 'm/d/Y',
    );

    $now      = new DateTime();
    $in       = DateTime::createFromFormat($patterns[$pattern], $birthdate);
    $interval = $now->diff($in);
    return $interval->y;
}

// Usage
echo getAge('05/29/1984', 'us');
// return 28
younes0
la source
3

Essayez l'un de ceux-ci en utilisant l'objet DateTime

$hours_in_day   = 24;
$minutes_in_hour= 60;
$seconds_in_mins= 60;

$birth_date     = new DateTime("1988-07-31T00:00:00");
$current_date   = new DateTime();

$diff           = $birth_date->diff($current_date);

echo $years     = $diff->y . " years " . $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $months    = ($diff->y * 12) + $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $weeks     = floor($diff->days/7) . " weeks " . $diff->d%7 . " day(s)"; echo "<br/>";
echo $days      = $diff->days . " days"; echo "<br/>";
echo $hours     = $diff->h + ($diff->days * $hours_in_day) . " hours"; echo "<br/>";
echo $mins      = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour) . " minutest"; echo "<br/>";
echo $seconds   = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour * $seconds_in_mins) . " seconds"; echo "<br/>";

Référence http://www.calculator.net/age-calculator.html

Shailesh Sonare
la source
3

Écrivez un script PHP pour calculer l'âge actuel d'une personne.

Exemple de date de naissance: 11.4.1987

Exemple de solution:

Code PHP:

<?php
$bday = new DateTime('11.4.1987'); // Your date of birth
$today = new Datetime(date('m.d.y'));
$diff = $today->diff($bday);
printf(' Your age : %d years, %d month, %d days', $diff->y, $diff->m, $diff->d);
printf("\n");
?>

Exemple de sortie:

Votre âge: 30 ans, 3 mois, 0 jour

Hosam Elzagh
la source
2

c'est ma fonction pour calculer DOB avec le retour spécifique de l'âge par année, mois et jour

function ageDOB($y=2014,$m=12,$d=31){ /* $y = year, $m = month, $d = day */
date_default_timezone_set("Asia/Jakarta"); /* can change with others time zone */

$ageY = date("Y")-intval($y);
$ageM = date("n")-intval($m);
$ageD = date("j")-intval($d);

if ($ageD < 0){
    $ageD = $ageD += date("t");
    $ageM--;
    }
if ($ageM < 0){
    $ageM+=12;
    $ageY--;
    }
if ($ageY < 0){ $ageD = $ageM = $ageY = -1; }
return array( 'y'=>$ageY, 'm'=>$ageM, 'd'=>$ageD );
}

voici comment l'utiliser

$ age = ageDOB (1984,5,8); / * avec mon heure locale est le 2014-07-01 * /
echo sprintf ("age =% d ans% d mois% d jours", $ age ['y'], $ age ['m'], $ age ['d']); / * sortie -> âge = 29 ans 1 mois 24 jours * /
MdPutra
la source
2

Cette fonction renverra l'âge en années. La valeur d'entrée est une chaîne de jour de naissance formatée par date (AAAA-MM-JJ), par exemple: 2000-01-01

Cela fonctionne avec le jour - précision

function getAge($dob) {
    //calculate years of age (input string: YYYY-MM-DD)
    list($year, $month, $day) = explode("-", $dob);

    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;

    // if we are any month before the birthdate: year - 1 
    // OR if we are in the month of birth but on a day 
    // before the actual birth day: year - 1
    if ( ($month_diff < 0 ) || ($month_diff === 0 && $day_diff < 0))
        $year_diff--;   

    return $year_diff;
}

Salut, nira

Nira
la source
1

Si vous n'arrivez pas à utiliser certaines des nouvelles fonctions, voici quelque chose que j'ai fouetté. Probablement plus que ce dont vous avez besoin, et je suis sûr qu'il existe de meilleures façons, mais c'est facile à lire, donc cela devrait faire le travail:

function get_age($date, $units='years')
{
    $modifier = date('n') - date('n', strtotime($date)) ? 1 : (date('j') - date('j', strtotime($date)) ? 1 : 0);
    $seconds = (time()-strtotime($date));
    $years = (date('Y')-date('Y', strtotime($date))-$modifier);
    switch($units)
    {
        case 'seconds':
            return $seconds;
        case 'minutes':
            return round($seconds/60);
        case 'hours':
            return round($seconds/60/60);
        case 'days':
            return round($seconds/60/60/24);
        case 'months':
            return ($years*12+date('n'));
        case 'decades':
            return ($years/10);
        case 'centuries':
            return ($years/100);
        case 'years':
        default:
            return $years;
    }
}

Exemple d'utilisation:

echo 'I am '.get_age('September 19th, 1984', 'days').' days old';

J'espère que cela t'aides.

maiorano84
la source
1

En raison de l'année bissextile, il n'est pas sage de soustraire simplement une date d'une autre et de l'étaler au nombre d'années. Pour calculer l'âge comme les humains, vous aurez besoin de quelque chose comme ceci:

$birthday_date = '1977-04-01';
$age = date('Y') - substr($birthday_date, 0, 4);
if (strtotime(date('Y-m-d')) - strtotime(date('Y') . substr($birthday_date, 4, 6)) < 0)
{
    $age--;
}
mileusna
la source
1

Ce qui suit fonctionne très bien pour moi et semble être beaucoup plus simple que les exemples qui ont déjà été donnés.

$dob_date = "01";
$dob_month = "01";
$dob_year = "1970";
$year = gmdate("Y");
$month = gmdate("m");
$day = gmdate("d");
$age = $year-$dob_year; // $age calculates the user's age determined by only the year
if($month < $dob_month) { // this checks if the current month is before the user's month of birth
  $age = $age-1;
} else if($month == $dob_month && $day >= $dob_date) { // this checks if the current month is the same as the user's month of birth and then checks if it is the user's birthday or if it is after it
  $age = $age;
} else if($month == $dob_month && $day < $dob_date) { //this checks if the current month is the user's month of birth and checks if it before the user's birthday
  $age = $age-1;
} else {
  $age = $age;
}

J'ai testé et utilisé activement ce code, cela peut sembler un peu encombrant mais il est très simple à utiliser et à éditer et est assez précis.

JustSomeGuy
la source
1

En suivant la première logique, vous devez utiliser = dans la comparaison.

<?php 
    function age($birthdate) {
        $birthdate = strtotime($birthdate);
        $now = time();
        $age = 0;
        while ($now >= ($birthdate = strtotime("+1 YEAR", $birthdate))) {
            $age++;
        }
        return $age;
    }

    // Usage:

    echo age(implode("-",array_reverse(explode("/",'14/09/1986')))); // format yyyy-mm-dd is safe!
    echo age("-10 YEARS") // without = in the comparison, will returns 9.

?>
maikelsalazar
la source
Voté contre. Bien que cela fonctionne, il est inefficace d'utiliser une boucle pour faire des calculs de base.
Wranorn
1

C'est un problème lorsque vous utilisez strtotime avec JJ / MM / AAAA. Vous ne pouvez pas utiliser ce format. Au lieu de cela, vous pouvez utiliser MM / JJ / AAAA (ou bien d'autres comme AAAAMMJJ ou AAAA-MM-JJ) et cela devrait fonctionner correctement.

Bruno Foggia
la source
1

Que diriez-vous de lancer cette requête et de laisser MySQL la calculer pour vous:

SELECT 
username
,date_of_birth
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) DIV 12 AS years
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) MOD 12 AS months
FROM users

Résultat:

r2d2, 1986-12-23 00:00:00, 27 , 6 

L'utilisateur a 27 ans et 6 mois (il compte un mois entier)

Artur Kędzior
la source
C'est en fait une bonne solution pour les personnes sur les versions antérieures à 5.3 de PHP qui n'ont pas accès à date_diff et autres.
strangerstudios
1

Je l'ai fait comme ça.

$geboortedatum = 1980-01-30 00:00:00;
echo leeftijd($geboortedatum) 

function leeftijd($geboortedatum) {
    $leeftijd = date('Y')-date('Y', strtotime($geboortedatum));
    if (date('m')<date('m', strtotime($geboortedatum)))
        $leeftijd = $leeftijd-1;
    elseif (date('m')==date('m', strtotime($geboortedatum)))
       if (date('d')<date('d', strtotime($geboortedatum)))
           $leeftijd = $leeftijd-1;
    return $leeftijd;
}
Smorvy
la source
1

La meilleure réponse à cela est OK, mais seulement calualtes l'année de naissance d'une personne, je l'ai ajustée à mes propres fins pour calculer le jour et le mois. Mais j'ai pensé que cela valait la peine d'être partagé.

Cela fonctionne en prenant un horodatage de la date de naissance des utilisateurs, mais n'hésitez pas à changer cela

$birthDate = date('d-m-Y',$usersDOBtimestamp);
$currentDate = date('d-m-Y', time());
//explode the date to get month, day and year
$birthDate = explode("-", $birthDate);
$currentDate = explode("-", $currentDate);
$birthDate[0] = ltrim($birthDate[0],'0');
$currentDate[0] = ltrim($currentDate[0],'0');
//that gets a rough age
$age = $currentDate[2] - $birthDate[2];
//check if month has passed
if($birthDate[1] > $currentDate[1]){
      //user birthday has not passed
      $age = $age - 1;
} else if($birthDate[1] == $currentDate[1]){ 
      //check if birthday is in current month
      if($birthDate[0] > $currentDate[0]){
            $age - 1;
      }


}
   echo $age;
Paul Ledger
la source
1

Si vous ne voulez atteindre votre âge que l'âge, il existe un moyen très simple de le faire. traiter les dates au format «AAAAMMJJ» comme des nombres et les soustraire. Après cela, annulez la partie MMDD en divisant le résultat par 10000 et réduisez-le. Simple et n'échoue jamais, prend même en compte les leapyears et l'heure actuelle de votre serveur;)

Depuis birthays ou principalement fournis par des dates complètes sur le lieu de naissance et ils sont pertinents pour L'HEURE LOCALE ACTUELLE (où la vérification de l'âge est effectivement effectuée).

$now = date['Ymd'];
$birthday = '19780917'; #september 17th, 1978
$age = floor(($now-$birtday)/10000);

donc si vous voulez vérifier si quelqu'un a 18 ou 21 ans ou moins de 100 sur votre fuseau horaire (sans oublier le fuseau horaire d'origine) par anniversaire, c'est ma façon de le faire

simplemath
la source
0

Essaye ça :

<?php
  $birth_date = strtotime("1988-03-22");
  $now = time();
  $age = $now-$birth_date;
  $a = $age/60/60/24/365.25;
  echo floor($a);
?>
Michael
la source