1.7k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,
ich sitze seit 4 Stunden an einem eigenlich einfachen Problem, habe
auch schon google bemüht - leider ohne zufrieden stellende lösung.
ich habe die Geburtsdaten in eine Datenbank in utc mit mktime
geschrieben. Bei Freunden die vor den 1.1.1970 geboren wurden mit -
Zeichen.

Nun möchte ich von allen das Alter berechnen. Bei unseren Freunden
vor 1970 erscheint das leider falsche Alter (17.06.1931, -121629240,
Alter: 43)

Code aus dem Google- Netz:

$alter = intval(($time_jetzt - $myrow[6]) / 31536000);

Danke im vorraus für jede Hilfe

3 Antworten

0 Punkte
Beantwortet von deluxestyle Mitglied (901 Punkte)
ich hab mir dafür ne kleine funktion geschrieben

function getAge($datum) {
$gebdat = explode(".", $datum);

$akt_jahr = date("Y");
$akt_monat = date("m");
$akt_tag = date("d");

$geb_jahr = $gebdat[2];
$geb_monat = $gebdat[1];
$geb_tag = $gebdat[0];

$alter = $akt_jahr - $geb_jahr;
$v = $akt_monat - $geb_monat;
// Geb-Monat in der Zukunft
if ($v < 0) {
$alter = $alter - 1;
// aktuelles Monat ist Geb-Monat
} elseif ($v == 0) {
$d = $akt_tag - $geb_tag;
if ($d < 0) { $alter = $alter - 1; }
}

return $alter;
}


Das Geburtsdatum wird im Format dd.mm.yyyy erwartet
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Daten sollten schon aus Gründen der Portierbarkeit nicht als UNIX-Timestamps, sondern als DATE-Felder gespeichert werden.

In mySQL kannst du dann das Alter z.B. mit dieser Formel berechnen:

SELECT geburtsdatum,(YEAR(CURDATE())-YEAR(geburtsdatum)) - ( RIGHT(CURDATE(),5) < RIGHT(geburtsdatum,5) ) AS `alter` FROM leute
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Das Alter ist richtig, da -121629240 Sekunden / 60 = 2027154 Minuten / 60 = 33785,9 Stunden / 24 = 1407,7 Tage - und das sind rund 4 Jahre - also 39 (1970 bis 2009) plus 4 = 43.

Negative Werte mit mktime() werden laut Doku auch gar nicht unterstützt. Darüberhinaus ist deine Berechnung ohnehin fehlerhaft, da du keine Schaltjahre berücksichtigst.

Speicher das Geburtsdatum also entweder im DATE-Format oder als NUMBER in z.B. der Form 19310617.
...