PHP - Alter berechnen lassen

Zneaf

Erfahrenes Mitglied
Hi Leute ;)

habe vor ein paar Tagen bei den Profil-Seiten meiner Website programmiert, dass automatisch das Alter anhand des Geburtsdatums und den aktuellen Datums berechnet wird. Das funktioniert auch ganz gut.

Ich habe nur ein Problem...ich weiß nicht genau, wie ich auch Schaltjahre bei der Berechnung des Alters berücksichtigen kann.

Hier mein bisheriger Code:
PHP:
$bday = $row->bday;
$month = $row->bmonth;
$byear = $row->byear;
	
$time = mktime(0,0,0,date("m"),date("d"),date("Y")); 
$birthday = mktime(0,0,0,$bmonth,$bday,$byear); 
$alter   = intval(($time - $birthday) / (3600 * 24 * 365));

echo "$alter";

Ich sollte vielleicht noch erwähnen, dass er sich das Geburtsdatum aus der DB abholt ($bday, $bmonth, $byear).

Habt ihr vielleicht ne Idee, wie man die Schaltjahre berücksichtigen kann?
Hab mich im Internet fast zu Tode gesucht, aber nichts gefunden, was sich verwenden lies^^

Vielen Dank im Voraus ;)

LG Zneaf
 
Hallo,

oder du berechnest es so:
PHP:
$byear= 1911;
$bmonth = 12;
$bday = 25;

  // aktuelles Datum als assoziatives Array:
  $today = getdate();

  // Jahres-, Monats- und Tagesdifferenz als assoziatives Array:
  $age['year'] = $today['year'] - $byear;
  $age['month'] = $today['mon'] - $bmonth;
  $age['day'] = $today['mday'] - $bday;

  // Korrektur der negativen Differenzwerte:
  if($age['day'] < 0)
  {
    $age['day'] += cal_days_in_month(CAL_GREGORIAN,$bmonth,$byear);
    $age['month']--;
  }
  if($age['month'] < 0)
  {
    $age['month'] += 12;
    $age['year']--;
  }

echo 'Das Lebensalter beträgt '.$age['year'].' Jahre.';
Ausgabe:
Code:
Das Lebensalter beträgt 99 Jahre.
 
Hey Leute ;)

erstmal Vielen Dank für die super schnelle Antwort =)

@ComFreek: Leider werd ich aus keinem der beiden Vorschläge so 100% schlau^^ *sorry*

@hela: Ich hab den Code von dir mal eingefügt und ausgeben lassen. Der funktioniert soweit auch ganz gut. Allerdings wird beim Berechnen des Alters nicht so ganz auf Monate und Tage geachtet^^ Soll heißen: Alle Leute, die im gleichen Jahr geburtstag haben, sind gleich alt.

Hier mal ein Beispiel:
PHP:
$bday = "23";
$month = "12";
$byear = "1988";

// aktuelles Datum als assoziatives Array: 
$today = getdate(); 

// Jahres-, Monats- und Tagesdifferenz als assoziatives Array: 
$age['year'] = $today['year'] - $byear; 
$age['month'] = $today['mon'] - $bmonth; 
$age['day'] = $today['mday'] - $bday; 

// Korrektur der negativen Differenzwerte: 
if($age['day'] < 0) 
{ 
	$age['day'] += cal_days_in_month(CAL_GREGORIAN,$bmonth,$byear); 
	$age['month']--; 
} 
if($age['month'] < 0) 
{ 
	$age['month'] += 12; 
	$age['year']--; 
}

echo $age['year'];

Heraus kommt:
23

Richtig wäre:
22

Könnt ihr euch darauf einen Reim machen?^^
Ist vllt. was an der ausgabe (echo $age['year'];) falsch? Damit gebe ich ja eigentlich lediglich die Differenz der Jahre aus...wenn ichs verstanden haben sollte^^

Vielen Dank

LG Zneaf
 
Bei mir kommt auch was anderes heraus:
PHP:
$byear= 1988;
$bmonth = 12;
$bday = 23;

  // aktuelles Datum als assoziatives Array:
  $today = getdate();

  // Differenzen als assoziatives Array:
  $age['year'] = $today['year'] - $byear;
  $age['month'] = $today['mon'] - $bmonth;
  $age['day'] = $today['mday'] - $bday;

  // Korrektur der negativen Differenzwerte:
  if($age['day'] < 0)
  {
    $age['day'] += cal_days_in_month(CAL_GREGORIAN,$bmonth,$byear);
    $age['month']--;
  }
  if($age['month'] < 0)
  {
    $age['month'] += 12;
    $age['year']--;
  }

echo '<br>Das Lebensalter beträgt '.$age['year'].' Jahre, '.$age['month'].' Monate und '.$age['day'].' Tage.';
Ausgabe:
Code:
Das Lebensalter beträgt 22 Jahre, 5 Monate und 20 Tage.

P.S.
Dein Fehler liegt sicherlich im Eingabewert $bmonth. Bei dir steht dort $month!
 
Zuletzt bearbeitet:
Hier mal ein Beispiel, das wie erwartet 10 Jahre ausgibt.
PHP:
/* Erst ab PHP 5.3! */
$datetime = new DateTime('2000-06-13');
$datetime2 = new DateTime();

$interval = $datetime->diff($datetime2);

echo $interval->format("%y Jahre alt");

Und wenn man noch deine Variablen einsetzt, ergibt sich:
PHP:
$datetime = new DateTime($byear."-".$bmonth."-".$bday);
$datetime2 = new DateTime();

$interval = $datetime->diff($datetime2);

echo $interval->format("%y Jahre alt");

Zur Erklärung:

Zuerst legen wir zwei DateTime-Objekte an, das eine mit dem Geburtsdatum, das andere mit dem aktuellen Datum (und Uhrzeit).

Danach lassen wir uns die Differenz per DateTime::diff() berechnen und formatieren es mit DateTime::format().


PS: In deinem Code fehlt in der 2. Zeile vor "month" ein b, wohl ein Tippfehler.
PSS: Es sind zwar zwei Antworten vor mir gekommen, aber ich die kürzeste Lösung ;)
 
Zuletzt bearbeitet:
@saftmeister: Die Lösung ist auch cool, funktioniert aber offensichtlich nur innerhalb der UNIX-Ära.
@ComFreek: Das ist erst ab PHP-Version 5.3 nutzbar. (Ich habe hier noch 5.2.6 :-().
 
Zurück