Wer ein Registrierungsformular oder ein Benutzerprofil programmiert, braucht früher oder später eine Möglichkeit, das Alter eines Nutzers anhand seines Geburtsdatums zu berechnen. In PHP geht das mit wenigen Zeilen, und seit der DateTime-Klasse sogar besonders elegant. Dieses Tutorial zeigt dir den modernen Weg mit DateTime::diff(), den klassischen Ansatz mit mktime(), und praktische Szenarien wie die Altersprüfung für Formulare oder das Parsen verschiedener Datumsformate.
graph TD
A["Geburtsdatum erhalten"] --> B{"PHP >= 5.3?"}
B -->|Ja| C["DateTime + diff() nutzen"]
B -->|Nein| D["mktime() + time() nutzen"]
C --> E["checkdate() zur Validierung"]
D --> E
E --> F["Alter in Jahren ausgeben"]
Alter berechnen mit der DateTime-Klasse
Der modernste und zuverlässigste Weg ist die DateTime-Klasse. Sie berücksichtigt Schaltjahre korrekt und liefert über die Methode diff() ein DateInterval-Objekt mit der genauen Differenz.
<?php
function berechneAlter(int $tag, int $monat, int $jahr): int
{
$geburtstag = new DateTime();
$geburtstag->setDate($jahr, $monat, $tag);
$heute = new DateTime();
$differenz = $heute->diff($geburtstag);
return $differenz->y;
}
echo berechneAlter(15, 3, 1990);
/* Gibt z.B. 36 aus (Stand 2026) */
?>
Die Funktion erwartet Tag, Monat und Jahr als Integer. Mit setDate() wird daraus ein DateTime-Objekt erzeugt, und diff() berechnet den Abstand zum heutigen Datum. Die Eigenschaft y des Ergebnisses enthält die vollen Jahre.
Verschiedene Datumsformate parsen
Formulardaten kommen selten im gleichen Format an. Ein deutsches Formular liefert 15.03.1990, eine Datenbank 1990-03-15 und eine API vielleicht 03/15/1990. Mit DateTime::createFromFormat() kannst du jedes beliebige Format zuverlässig parsen.
<?php
/* Deutsches Format: TT.MM.JJJJ */
$dt1 = DateTime::createFromFormat('d.m.Y', '15.03.1990');
/* ISO-Format: JJJJ-MM-TT */
$dt2 = DateTime::createFromFormat('Y-m-d', '1990-03-15');
/* US-Format: MM/TT/JJJJ */
$dt3 = DateTime::createFromFormat('m/d/Y', '03/15/1990');
/* Alle drei ergeben dasselbe Datum */
echo $dt1->format('Y-m-d'); // 1990-03-15
?>
Die folgende Tabelle zeigt die gängigsten Formate und ihre Format-Strings:
| Format | Beispiel | Format-String |
|---|
| Deutsch | 15.03.1990 | d.m.Y |
| ISO 8601 | 1990-03-15 | Y-m-d |
| US-Format | 03/15/1990 | m/d/Y |
| Kurz | 15.3.90 | d.m.y |
Wenn createFromFormat() das Datum nicht parsen kann, gibt die Methode false zurück. Prüfe das Ergebnis also immer, bevor du damit weiterarbeitest.
Eingaben prüfen mit checkdate()
Bevor du das Alter berechnest, solltest du sicherstellen, dass das übergebene Datum überhaupt gültig ist. Die eingebaute Funktion checkdate() prüft genau das, inklusive Schaltjahren.
<?php
function berechneAlter(int $tag, int $monat, int $jahr): int
{
if (!checkdate($monat, $tag, $jahr)) {
throw new InvalidArgumentException(
"Ungültiges Datum: $tag.$monat.$jahr"
);
}
$geburtstag = new DateTime();
$geburtstag->setDate($jahr, $monat, $tag);
$heute = new DateTime();
return $heute->diff($geburtstag)->y;
}
?>
Mit checkdate() werden ungültige Werte wie der 31. Februar oder negative Zahlen zuverlässig erkannt. Statt die() wird hier eine Exception geworfen. So kann der aufrufende Code selbst entscheiden, wie er den Fehler behandelt.
Der klassische Weg mit mktime()
Bevor es die DateTime-Klasse gab, wurde die Altersberechnung häufig über Unix-Timestamps gelöst. Dieser Ansatz funktioniert zwar, hat aber Einschränkungen bei Daten vor 1970.
<?php
function berechneAlterKlassisch(
int $tag, int $monat, int $jahr
): string {
$timestamp = mktime(0, 0, 0, $monat, $tag, $jahr);
$differenz = time() - $timestamp;
return (date("Y", $differenz) - 1970) . " Jahre";
}
echo berechneAlterKlassisch(15, 3, 1990);
?>
Hier wird mit mktime() ein Timestamp des Geburtsdatums erzeugt und vom aktuellen Timestamp abgezogen. Anschließend rechnet date("Y") die Differenz in Jahre um. Seit 1970 abzuziehen liefert das Alter. Für die meisten Fälle reicht das, aber die DateTime-Variante ist präziser und lesbarer.
Alter aus einem Datenbank-Datum berechnen
In der Praxis kommt das Geburtsdatum meistens aus einer MySQL-Datenbank. Das DATE-Feld liefert einen String im Format YYYY-MM-DD, den DateTime direkt verarbeiten kann.
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=meinedb;charset=utf8mb4',
'benutzer',
'passwort'
);
$stmt = $pdo->prepare(
'SELECT vorname, geburtsdatum FROM benutzer WHERE id = ?'
);
$stmt->execute([42]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
$geburtstag = new DateTime($user['geburtsdatum']);
$alter = (new DateTime())->diff($geburtstag)->y;
echo $user['vorname'] . ' ist ' . $alter . ' Jahre alt.';
}
?>
Da MySQL-Datumsfelder im ISO-Format gespeichert werden, kann new DateTime() den String ohne weitere Konvertierung verarbeiten. Verwende immer Prepared Statements mit Platzhaltern, um SQL-Injection zu verhindern.
Praktisches Anwendungsbeispiel
In der Praxis kommt das Geburtsdatum oft als String aus einem Formular. Hier ein Beispiel, das zeigt, wie du den String zerlegst und das Alter berechnest.
<?php
function alterAusDatumString(string $datum): int
{
$geburtstag = new DateTime($datum);
$heute = new DateTime();
return $heute->diff($geburtstag)->y;
}
/* Aus einem Formularfeld: */
$alter = alterAusDatumString("1990-03-15");
echo "Alter: $alter Jahre";
?>
Wenn du ein Datum im Format YYYY-MM-DD hast, kann DateTime den String direkt verarbeiten. Das spart den Umweg über drei einzelne Parameter und macht den Code noch kompakter.
Altersprüfung für Formulare
Ein häufiger Anwendungsfall ist die Prüfung, ob ein Nutzer ein bestimmtes Mindestalter erreicht hat. Die folgende Funktion prüft, ob jemand volljährig ist, und lässt sich leicht an andere Altersgrenzen anpassen.
<?php
function istVolljaehrig(
string $geburtsdatum,
int $mindestalter = 18
): bool {
$geburtstag = DateTime::createFromFormat(
'Y-m-d', $geburtsdatum
);
if (!$geburtstag) {
return false;
}
$alter = (new DateTime())->diff($geburtstag)->y;
return $alter >= $mindestalter;
}
/* Formularauswertung */
$datum = $_POST['geburtsdatum'] ?? '';
if (!istVolljaehrig($datum)) {
echo 'Du musst mindestens 18 Jahre alt sein.';
} else {
echo 'Registrierung erfolgreich!';
}
?>
Die Funktion gibt false zurück, wenn das Datum ungültig ist oder das Mindestalter nicht erreicht wird. Den Standardwert von 18 kannst du bei Bedarf ändern, zum Beispiel auf 16 für bestimmte Angebote.
Verwandte Tutorials
Diese Tutorials helfen dir, das Thema Datum und Alter in PHP zu vertiefen: