en

designoir

Altersberechnung

Die korrekte Berechnung eines Alters bei gegebenem Geburtsdatum scheint in PHP-Kreisen kein triviales Problem zu sein. Zwar gehe ich davon aus hoffe ich, dass es PHP-Programmierer gibt, die solchen Aufgaben gewachsen sind, doch diese halten sich offenbar lieber zurück. Jedenfalls hat mich meine Suche ausschließlich zu erstaunlich ungenauen, falschen und/oder umständlichen Lösungen geführt. Ich denke, jemand sollte unsere Ehre retten, und … ach, ich mach’s selbst.

getAge.php

Die Funktion erwartet Geburtsjahr, -monat und -tag in dieser Reihenfolge als einzelne Argumente. Sie gibt volle Jahre zurück.

<?php

/**
 * function getAge
 * Copyright (C) 2006  Dao Gottwald
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Contact information:
 *   Dao Gottwald  <dao at design-noir.de>
 *
 * @version  1.0
 */

function getAge($y, $m, $d) {
    return date('Y') - $y - (date('n') < (ltrim($m,'0') + (date('j') < ltrim($d,'0'))));
}

?>

Das war’s schon? – Ja, und es war gar nicht so schlimm, oder?

Beispiel #1: test-cases.php

Hier noch ein paar Testfälle, zu denen die Funktion hoffentlich die richtigen Ergebnisse liefert.

<?php

require_once 'getAge.php';

function test($y, $m, $d) {
    echo str_pad($y.'-'.$m.'-'.$d, 12), getAge($y, $m, $d), "\n";
}

test(1985, 10, 27);
test(2000, 1, 1);
test('2000', '01', '01');
test(2000, 12, 31);
test(2000, date('m'), 1);
test(2000, date('m'), date('d'));
test(2000, date('m', strtotime('+1 day')), date('d', strtotime('+1 day')));
test(-38000, 1, 1);
test(2100, 1, 1);
test(2100, 12, 31);
echo "\n";
for ($i = 0; $i <= 30; $i += 3) {
    $t = strtotime('-'.$i.'00 days');
    test(date('Y', $t), date('m', $t), date('d', $t));
}

?>

test-cases.php ausführen

Kommentare

  1. dooof meinte am 29. März ’06, 08:25 Uhr ():
    dooooooooooooof
  2. Gerd meinte am 22. November ’06, 03:09 Uhr ():
    Sieht alles ganz gut aus, aber was ist mit den Jahren vor 1582 (julianische Kalender)?
  3. Dao meinte am 22. November ’06, 03:50 Uhr ():
    Wer am 4. Oktober 1582 (julianisch) geboren ist, würde auch nach dem gregorianischen Kalender am 4. Oktober feiern, nicht? Ist ja nicht so, dass wir von Jahrestag zu Jahrestag die Tage oder Sekunden zählen – nein, wir interessieren uns nur fürs Datum. Und um mehr als die alltägliche Altersangabe geht es hier nicht (deshalb auch bewusst nur ganzzahlige Ergebnisse).
  4. justSomeGuy meinte am 11. April ’07, 00:21 Uhr ():
    Wow mate nice one, i also found some long ways to do it but was looking for a short way thanks a bunch
  5. Nathan Salter meinte am 22. August ’08, 17:48 Uhr ():
    You should really put in the checkdate() function to avoid people typing in invalid dates, and also put a function that makes sure the date isn’t in the future. You could use a strpos() function to check that as well, check their date with the current date. I know it won’t look so elegant, but would work slightly more efficiently
  6. Martin meinte am 13. Juli ’09, 09:54 Uhr ():
    Ich habe ewig nach einer guten Altersberechnung gesucht.

    Danke dafür :)

HTML wird nicht interpretiert.

Geändert am 28. Januar ’07 Dão G., 2005–2010
aggressiv akt andromeda bar beine blue efeu frontal fugaetu industriell komet land noir rost rot sonnenblume splash split winter wolke zeit