Aktuelles Alter berechnen aus Geburtsdatum (PHP)

Wenn vom Nutzer das Geburtsdatum vorhanden ist, lässt sich mit folgender Funktion sehr leicht das aktuelle Alter errechnen:

function alter( $datum )
{
  $geburtstag = new DateTime($datum);
  $heute = new DateTime(date('Y-m-d'));
  $differenz = $geburtstag->diff($heute);
 
  return $differenz->format('%y');
}

Der Aufruf erfolgt z.B. über alter(‚1984-10-19‘); und ergibt dann (im Moment des Beitrags hier): 28

Das funtioniert jedoch erst ab Version 5.3 – vorher ist die Diff-Funktion im DateTime-Objekt nicht verfügbar. Wer eine ältere PHP-Version verwendet, kann sich mit folgender Funktion behelfen:

function alter( $datum )
{
  list($jahr, $monat, $tag) = explode("-", $datum);
  $jahr_diff  = date("Y") - $jahr;
  $monat_diff = date("m") - $monat;
  $tag_diff   = date("d") - $tag;
  if( ($monat_diff<0) || ($monat_diff==0 && $tag_diff<0) )
    $jahr_diff--;
  return $jahr_diff;
}

So könnte der Aufruf beider Funktionen aussehen:

print 'Alter: ' . alter('1984-10-29') . '<br />';

Weitergehende Infos zu den verwendeten Funktionen:

  • date()-Funktion
  • date_diff() – Differenz zwischen zwei Daten berechnen (ab PHP5.3)

19 thoughts on “Aktuelles Alter berechnen aus Geburtsdatum (PHP)”

  1. Moin,

    ich würde gerne als Geburtsdatum eine Inputvariable aus input type date verwenden und scheitere aktuell an der Übergabe mit
    print 'Alter: ' . alter($POST['gebdatum']) .
    geht es nicht

    danke

    1. zwei Dinge fallen mir auf Anhieb auf:

      1. die Zeile sollte nicht mit einem Punkt enden, sondern mit einem Semikolen (vielleicht war es ja nur ein Auszug).
      2. die Post-Variable sieht wie folgt aus: $_POST['gebdatum'] (mit Unterstrich nach dem Dollar-Zeichen)

      vielleicht hilft das schon weiter. Ansonsten wäre es hilfreich, die konkrete Fehlerbeschreibung / Fehlermeldung zu kennen.

  2. Auf http://rexo.ch/knowledge/index.php/2078/wie-das-alter-jahren-f%C3%BCr-gegebenes-geburtsdatum-berechnen ist eine simple Variante, die auch mit alten PHP-Versionen bestens funktioniert.

  3. Hi Gabriel, Grüße nach Templin! Vorab, ich bin Programmier-Laie und betreibe eine private Website via WordPress (mit Plugins und Code-Schnipsel und viel Ausprobieren etc.). Ich würde gern die Berechnung von oben verwenden. Was muss ich machen, wenn ich bei jedem Artikel/Beitrag in WP eine solche unterschiedliche Berechnung einbinden will (oder geht das nur bei Seiten)? Welche Datei muss ich wie verändern? Herzlichen Dank im Voraus für die Antwort! LG Sam

    1. Nein, es geht sowohl bei Seiten als auch bei Beiträgen.

      Welche Datei Du bearbeiten musst, hängt vom verwendeten Theme ab. Manche implementieren die page.php (für Seiten) und die single.php (für Beiträge). Dort könntest Du das einfach an der entsprechenden Stelle einfügen (evtl. vorher mit einfachem echo-Befehl und kleiner Test-Zeichenkette testen ohne Berechnung, um Fehler auszuschließen).

      Manche Themes sind auch etwas komplexer aufgebaut und binden weitere Dateien für die Inhaltsdarstellung ein (an den include / require Befehlen zu erkennen). Da müsstest Du Dich dann zur betreffenden Stelle (durchhangeln).

      Wenn es nicht klappt, melde Dich noch mal.

      Viel Erfolg! :)

  4. Hi, ich nochmal. Danke für die Hilfe! Wenn ich den Code von oben in meine single.php einfüge, bekomme ich in jedem Artikel „Alter: 33“ angezeigt. Was ja schon einmal ein Erfolgserlebnis ist.

    Kann ich aber auch jeden einzelnem Artikel/WP-Beitrag ein anderes Alter (Geburtsdatum) zuweisen? Unterschiedliche Alter also? Direkt im Beitrag? Und wenn ja, wie geht das? Sorry, totaler Laie…

    Dazu noch eine weitere Frage: Ich habe gelesen, das funktioniert nur bis 01.01.1970 – kann man das auch umgehen (etwa fürs Geburtsdatum meines Vaters)?

    Ganz, ganz großen Dank im Voraus. LG

    1. > Kann ich aber auch jeden einzelnem Artikel/WP-Beitrag ein anderes
      > Alter (Geburtsdatum) zuweisen?

      Klar, grundsätzlich kannst Du zuweisen, was Du willst. Musst Dir nur vorher überlegen, nach welcher Regel das funktionieren soll. Woher „weiß“ der Beitrag, welches Datum relevant ist? Willst Du das am Beitrag speichern oder woher kommt das Datum?

      Dazu wäre ein „optionales Feld“ hilfreich. Findest Du unterhalb der WordPress-Eingabebox (ggf. oben rechts erst aktivieren). Dort müsstest Du ein neues Feld definieren, sagen wir mal „geburtstag“ und dann z.B. „1980-02-14“ eintragen als Wert („Aktualisieren“ dann).

      Diesen Wert kannst Du dann in der single.php auslesen. Zum Beispiel so:

      $geburtstag = get_post_meta( get_the_ID(), "geburtstag" );
      print 'Alter: ' . alter($geburtstag);

      > funktioniert nur bis 01.01.1970

      Das sollte auch für Daten vorher funktionieren.

  5. Benutzerdefiniertes Feld im Test-Beitrag heißt geburtstag wie empfohlen, Wert 1980-02-14 ist auch vergeben. Dennoch bekomme ich als Alter immer 0 angezeigt.

    in der single.php steht jetzt folgendes. Ist da irgendwo ein (Denk-)Fehler drin?

    diff($heute);

    return $differenz->format(‚%y‘);

    $geburtstag = get_post_meta( get_the_ID(), „geburtstag“ );
    }
    print ‚ALTER: ‚ . alter($geburtstag);
    ?>

  6. vielleicht gehts so

    <!– diff($heute);

    return $differenz->format(‚%y‘);

    $geburtstag = get_post_meta( get_the_ID(), „geburtstag“ );
    }
    print ‚ALTER: ‚ . alter($geburtstag);
    ?> –>

    1. Code-Blöcke lassen sich am besten posten, wenn Du sie in < code > Tags einschließt (ohne die Leerzeichen) also wie von anderen öffnenden und schließenden HTML-Tags gewohnt.

      So ist durch die Formatierung schwer zu sagen, wo der Fehler liegt.

  7. Wieder was gelernt. Dankeeee! Hier der Code aus meiner single.php


    function alter( $datum )
    {
    $geburtstag = new DateTime($datum);
    $heute = new DateTime(date('Y-m-d'));
    $differenz = $geburtstag->diff($heute);
    return $differenz->format('%y');
    $geburtstag = get_post_meta( get_the_ID(), "geburtstag" );
    }
    print 'ALTER: ' . alter($geburtstag);

    1. Mit Leerzeilen kommt das hier offenbar noch nicht so gut klar – habe die mal entfernt, nun scheint es zu gehen mit der Darstellung.

      Okay, schauen wir mal:
      Ah, ich seh‘ schon. Das get_post_meta sollte außerhalb der Funktionsdefinition erfolgen, sonst kennt er $geburtstag nur *innerhalb* der Funktion. Also einfach die Zeile

      $geburtstag = get_post_meta( get_the_ID(), "geburtstag" );

      nach der Funktionsdeklaration aufrufen (direkt oberhalb der print-Anweisung) und es sollte wie gewünscht funktionieren.

      (zusätzlich ist anzumerken, dass die Variable $geburtstag innerhalb der Funktion eine andere ist, als die dann unten, außerhalb der Funktion verwendete – nur zur Klarstellung)

  8. hallo gabriel
    danke für deine beiträge, haben mir weitergeholfen! verwende die altersberechnung um bei mitarbeiter die anzahl jahre welche sie angestellt sind anzuzeigen. die ausgabe habe ich mit einem shorcode soweit im griff.

    function anstellung_shortcode() {
    $anstellungsdatum = "01/12/2009";
    list($day,$month,$year) = explode("/",$anstellungsdatum);
    $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;
    }
    add_shortcode( 'anstellungsjahre', 'anstellung_shortcode' );

    gibt es eine möglichkeit das „anstellungsdatum“ als inputvariable von einer seite abzufangen. ($anstellungsdatum = get…?) und wie gebe ich dies dann in der einzelnen seite ein? danke schon mal für deine hilfe!

  9. … hab es hingekriegt! Funktioniert nun einwandfrei – danke nochmals für Deine Codeschnipsel – liebe Grüsse eines totalen PHP-Anfängers ;-)

  10. Ich habe mal etwas verändert, da hier des Öfteren die Frage auftauchte, wo gebe ich das Geburtsdatum ein oder das Datumsformat in Europäisch geändert hier als Beispiel die Zeitzone Europe/Berlin das ergibt das Datumsformat z.B. 29.04.1961
    Der Code funktioniert wirklich super und habe diesen bereits zur Altersverifizierung eingesetzt.

    // Zeitzone setzen
    date_default_timezone_set('Europe/Berlin');

    // Datum in einer Variable speichern
    $datum = date('d.m.Y');

    //Die Funktion
    function alter( $datum )
    {
    $geburtstag = new DateTime($datum);
    $heute = new DateTime(date('d.m.Y'));
    $differenz = $geburtstag->diff($heute);

    return $differenz->format('%y');
    }

    //Wenn das Geburtsdatum aus der Datenbank kommt dann den Namen der Tabelle z.B. '$user_geb_dat' ansonsten so '29.04.1961'
    $donner=alter($user_geb_dat);

    //Unter 18 wird der Hinweis gegeben "Sie sind unter 18 Jahre!" über 18 Jahre der Hinweis "Herzlich willkommen"
    if ($donner>=18) {$mist="Herzlich willkommen.";}
    else {$mist="Sie sind unter 18 Jahre!";}

    //Textausgabe
    echo $mist;

  11. Kann man zusätzlich im Ergebnis zu den Jahren auch die Monate anzeigen, also im Sinne von xx Jahre + xx Monate angestellt ?

    1. Klar, das geht auch problemlos:
      function alter($datum)
      {
      $geburtstag = new DateTime($datum);
      $heute = new DateTime(date('Y-m-d'));
      $differenz = $geburtstag->diff($heute);
      // Jahre und Monate formatieren
      return $differenz->format('%y Jahre + %m Monate');
      }

      1. Hallo Gabriel,
        wow – ich bin begeistert.
        Das hat mir – als PHP-Anfänger – sehr geholfen.
        Vielen Dank für Deine Unterstützung.

        1. 😊 Das freut mich sehr. Gerne 🤓

Schreibe einen Kommentar