PHP Alter berechnen

160

Ich suche nach einer Möglichkeit, das Alter einer Person anhand ihres Geburtsdokuments im Format TT / MM / JJJJ zu berechnen.

Ich habe die folgende Funktion verwendet, die mehrere Monate lang einwandfrei funktioniert hat, bis eine Art Panne dazu führte, dass die while-Schleife nie endete und die gesamte Site zum Stillstand kam. Da diese Funktion mehrmals täglich von fast 100.000 DOBs durchlaufen wird, ist es schwierig festzustellen, was dies verursacht hat.

Hat jemand eine zuverlässigere Methode zur Berechnung des Alters?

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

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

BEARBEITEN: Diese Funktion scheint manchmal in Ordnung zu sein, gibt jedoch "40" für ein DOB vom 14.09.1986 zurück

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

Antworten:

192

Das funktioniert gut.

<?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
quelle
1
Stimmen Sie zu, irgendwann müssen wir dieses Format verwenden mktime(). es scheint, dass PHP das strtotime()mit diesem Format falsch berechnet hat .
GusDeCooL
30
PHP strtotimeversteht Datumsformate perfekt, Sie müssen sich keine Sorgen machen: 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
Diese Funktion ist wirklich teurer als die anderen Lösungen. Es kommt von der Überbeanspruchung der Funktion date ().
Jarzon
Schönes anteiliges Datum. Danke
Roque Mejos
172
$tz  = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
     ->diff(new DateTime('now', $tz))
     ->y;

Ab PHP 5.3.0 können Sie mit dem Handy DateTime::createFromFormatsicherstellen, dass Ihr Datum nicht mit dem m/d/YFormat verwechselt wird , und mit der DateIntervalKlasse (via DateTime::diff) die Anzahl der Jahre zwischen jetzt und dem Zieldatum ermitteln.

salathe
quelle
1
Sieht vielversprechend aus, aber leider verwenden die meisten Server-Hosting in meinem Land immer noch PHP 5.2.x :(
GusDeCooL
3
Braucht es wirklich eine Zeitzone?
André Chalella
127
 $date = new DateTime($bithdayDate);
 $now = new DateTime();
 $interval = $now->diff($date);
 return $interval->y;
Wernight
quelle
Ich habe zuvor versucht, DateTime () zu verwenden, aber dadurch wird das Skript eingefroren. In meinen Protokollen wird PHP angezeigt. Warnung: date (): Es ist nicht sicher, sich auf die Zeitzoneneinstellungen des Systems zu verlassen, selbst wenn ich date_default_timezone_set ('Europe / Brussels') hinzufüge.
stef
1
Bist du sicher, dass du das # vor dieser Zeile entfernt hast? Sie sollten das in PHP.ini
Wernight
Es ist normalerweise sicher, diese Warnung zu ignorieren (besonders in diesem Fall).
Wernight
96

Ich benutze Datum / Uhrzeit dafür:

$age = date_diff(date_create($bdate), date_create('now'))->y;
Andrey Korchak
quelle
Sie können so etwas für Datumsformate im britischen Stil verwenden: $ age = date_diff (date_create (str_replace ('/', '.', $ Bdate)), date_create ('now')) -> y; wegen stackoverflow.com/questions/4163641/…
Richard
1
Einfachste Lösung, nur eine Zeile. Funktioniert nur mit PHP 5.3+
Rhaymand Tatlonghari
60

Einfache Methode zur Berechnung des Alters aus dob:

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

31556926 ist die Anzahl der Sekunden in einem Jahr.

Mike
quelle
16
übermäßige Nutzung von Funktionen ...$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Mavelo
4
Beste Lösung ... 1 Liner, einfach und nicht zu verwenden: mktime
Timmy
1
@ RobertM. Ist das in diesem Fall so schlimm? Ich denke nicht, dass diese Funktionen so komplex oder "schwer" sind
Dewan159
1
@ Dewan159 Blick auf den Bearbeitungsverlauf ... wurde geändert, um meiner Lösung zu entsprechen;)
Mavelo
4
Was ist mit Schaltsekunden?
Ksimka
17

// Altersrechner

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
quelle
5
Beste moderne Lösung 2016.
AlexioVay
14

Ich finde das funktioniert und ist einfach.

Von 1970 abziehen, da strtotime die Zeit vom 01.01.1970 berechnet ( http://php.net/manual/en/function.strtotime.php )

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

Ergebnisse:

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
quelle
Fast wahr ... strtotime () berechnet die Zeit von 1969-12-31 18:00:00
Phoenix
8

Wenn Sie das Alter der Verwendung des Dob berechnen möchten, können Sie diese Funktion auch verwenden. Es verwendet das DateTime-Objekt.

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
quelle
8

Ich dachte, ich würde das hier aufwerfen, da dies die beliebteste Form dieser Frage zu sein scheint.

Ich habe einen 100-Jahres-Vergleich mit 3 der beliebtesten Arten von Altersfunktionen durchgeführt, die ich für PHP finden konnte, und meine Ergebnisse (sowie die Funktionen) in meinem Blog veröffentlicht .

Wie Sie dort sehen können , sind alle 3 Funktionen gut vorgeformt, mit nur einem kleinen Unterschied zur 2. Funktion. Mein Vorschlag, basierend auf meinen Ergebnissen, ist die Verwendung der 3. Funktion, es sei denn, Sie möchten etwas Bestimmtes zum Geburtstag einer Person tun. In diesem Fall bietet die 1. Funktion eine einfache Möglichkeit, genau das zu tun.

Es wurde ein kleines Problem mit dem Test und ein weiteres Problem mit der 2. Methode gefunden! Update kommt bald zum Blog! Im Moment würde ich zur Kenntnis nehmen, dass die 2. Methode immer noch die beliebteste ist, die ich online finde, und dennoch diejenige, mit der ich die meisten Ungenauigkeiten finde!

Meine Vorschläge nach meinem 100-jährigen Rückblick:

Wenn Sie etwas Längeres wünschen, damit Sie Anlässe wie Geburtstage und dergleichen einbeziehen können:

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

Aber wenn Sie einfach nur das Alter und nichts mehr wissen wollen, dann:

function getAge($date) { // Y-m-d format
    return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}

getAge('1980-02-29');

Siehe BLOG


Ein wichtiger Hinweis zur strtotimeMethode:

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
quelle
8

Sie können die CarbonBibliothek verwenden , die eine API-Erweiterung für DateTime ist.

Sie können:

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

oder:

$age = (new \Carbon\Carbon($date))->age;
Broshi
quelle
1
Dies ist eine sauberere Lösung, aber es erfordert eine externe Bibliothek, die möglicherweise nicht für jedes Projekt die beste ist
stef
1
Kohlenstoff bietet die magische Eigenschaft age, die ein tut diffInYears. So können Sie schreiben:(new \Carbon\Carbon($date))->age
k0pernikus
4

Wenn Sie keine große Präzision benötigen, nur die Anzahl der Jahre, können Sie den folgenden Code verwenden ...

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

Sie müssen dies nur in eine Funktion einfügen und das Datum "1971-11-20" durch eine Variable ersetzen.

Bitte beachten Sie, dass die Genauigkeit des obigen Codes aufgrund der Schaltjahre nicht hoch ist, dh etwa alle 4 Jahre sind die Tage 366 statt 365. Der Ausdruck 60 * 60 * 24 * 365 berechnet die Anzahl der Sekunden in einem Jahr - Sie können Ersetzen Sie es durch 31536000.

Ein weiterer wichtiger Punkt ist die Verwendung von UNIX Zeitstempels sowohl das Problem des Jahres 1901 als auch des Jahres 2038 auftritt, was bedeutet, dass der obige Ausdruck für Daten vor dem Jahr 1901 und nach dem Jahr 2038 nicht korrekt funktioniert.

Wenn Sie mit den oben genannten Einschränkungen leben können, sollte dieser Code für Sie funktionieren.

Neven Boyanov
quelle
Was wird im Jahr 2038 passieren? "Jedes System" wird abstürzen, wenn time () verwendet wird.
Miguel
3
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();
return date('Y', $tdate) - date('Y', $dob);
Sergey Eremin
quelle
1
Funktioniert nicht Ihre Funktion würde anzeigen, dass jemand, der am 1. September 1990 geboren wurde, das gleiche Alter hat wie jemand, der am 1. Oktober 1990 geboren wurde - es würde (2010 - 1990) = 20 für beide berechnen.
PaulJWilliams
Welche Altersgenauigkeit benötigen Sie? Monat? Tag?
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
quelle
Scheint an einigen Daten in Ordnung zu sein, aber für andere gibt es nichts zurück, vermutlich wenn die IF nicht erfüllt ist?
stef
3

Ich habe dieses Skript für zuverlässig befunden. Das Datumsformat wird als JJJJ-MM-TT verwendet, es kann jedoch problemlos für andere Formate geändert werden.

/*
* 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
quelle
2
Bitte einige Details darüber, wie dies hilfreich sein wird. Nur eine Funktion einzufügen, ist keine richtige Antwort.
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
quelle
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
quelle
3

Probieren Sie eines dieser Objekte mit dem DateTime-Objekt aus

$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/>";

Referenz http://www.calculator.net/age-calculator.html

Shailesh Sonare
quelle
3

Schreiben Sie ein PHP-Skript, um das aktuelle Alter einer Person zu berechnen.

Geburtsdatum der Probe: 11.4.1987

Beispiellösung:

PHP-Code:

<?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");
?>

Beispielausgabe:

Ihr Alter: 30 Jahre, 3 Monate, 0 Tage

Hosam Elzagh
quelle
2

Dies ist meine Funktion zur Berechnung des DOB mit der spezifischen Altersrendite nach Jahr, Monat und Tag

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

So benutzt man es

$ age = ageDOB (1984, 5, 8); / * mit meiner Ortszeit ist 2014-07-01 * /
echo sprintf ("Alter =% d Jahre% d Monate% d Tage", $ age ['y'], $ age ['m'], $ age ['d']); / * Ausgabe -> Alter = 29 Jahre 1 Monat 24 Tage * /
MdPutra
quelle
2

Diese Funktion gibt das Alter in Jahren zurück. Der Eingabewert ist ein Datumsformat (JJJJ-MM-TT) des Geburtsdatums, z. B.: 2000-01-01

Es funktioniert mit Tagespräzision

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

Prost, nira

nira
quelle
1

Wenn Sie einige der neueren Funktionen nicht verwenden können, habe ich Folgendes zusammengestellt. Wahrscheinlich mehr als Sie brauchen, und ich bin sicher, es gibt bessere Möglichkeiten, aber es ist leicht zu lesen, also sollte es den Job machen:

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

Beispiel Verwendung:

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

Hoffe das hilft.

maiorano84
quelle
1

Aufgrund des Schaltjahres ist es nicht ratsam, nur ein Datum von einem anderen zu subtrahieren und es auf die Anzahl der Jahre zu beschränken. Um das Alter wie die Menschen zu berechnen, benötigen Sie ungefähr Folgendes:

$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
quelle
1

Das Folgende funktioniert gut für mich und scheint viel einfacher zu sein als die bereits gegebenen Beispiele.

$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;
}

Ich habe diesen Code getestet und aktiv verwendet. Er mag etwas umständlich erscheinen, ist aber sehr einfach zu verwenden und zu bearbeiten und ziemlich genau.

JustSomeGuy
quelle
1

Nach der ersten Logik müssen Sie im Vergleich = verwenden.

<?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
quelle
Abgestimmt. Während es funktioniert, ist es ineffizient, eine Schleife zu verwenden, um grundlegende Berechnungen durchzuführen.
Wranorn
1

Dies ist ein Problem, wenn Sie strtotime mit TT / MM / JJJJ verwenden. Sie können dieses Format nicht verwenden. Stattdessen können Sie MM / TT / JJJJ (oder viele andere wie JJJJMMTT oder JJJJ-MM-TT) verwenden und es sollte ordnungsgemäß funktionieren.

Bruno Foggia
quelle
1

Wie wäre es, wenn Sie diese Abfrage starten und MySQL sie für Sie berechnen lassen:

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

Ergebnis:

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

Der Benutzer hat 27 Jahre und 6 Monate (es zählt einen ganzen Monat)

Artur Kędzior
quelle
Dies ist eine gute Lösung für Leute mit PHP-Versionen vor 5.3, die keinen Zugriff auf date_diff und dergleichen haben.
strangerstudios
1

Ich habe es so gemacht.

$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
quelle
1

Die beste Antwort dafür ist in Ordnung, aber nur in dem Jahr, in dem eine Person geboren wurde. Ich habe sie für meine eigenen Zwecke angepasst, um Tag und Monat zu ermitteln. Aber ich dachte, es lohnt sich zu teilen.

Dies funktioniert, indem ein Zeitstempel des DOB des Benutzers verwendet wird. Sie können dies jedoch jederzeit ändern

$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
quelle
1

Wenn Sie nur als Alter volljährig werden möchten, gibt es eine sehr einfache Möglichkeit, dies zu tun. Behandeln Sie als 'JJJJMMTT' formatierte Daten als Zahlen und subtrahieren Sie sie. Danach stornieren Sie den MMDD-Teil, indem Sie das Ergebnis durch 10000 teilen und es auf den Boden legen. Einfach und scheitert nie, berücksichtigt sogar Leapyears und Ihre aktuelle Serverzeit;)

Da Geburtstage oder meistens durch vollständige Daten am Geburtsort angegeben sind und sie für die AKTUELLE LOKALE ZEIT relevant sind (wo die Altersüberprüfung tatsächlich durchgeführt wird).

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

Wenn Sie also bis zum Geburtstag überprüfen möchten, ob jemand in Ihrer Zeitzone 18 oder 21 oder weniger als 100 Jahre alt ist (ohne Rücksicht auf die Ursprungszeitzone), ist dies meine Vorgehensweise

simplemath
quelle
0

Versuche dies :

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