Wer Tag, Monat und Wochentag getrennt braucht, ruft oft dreimal date() mit verschiedenen Formatzeichen auf. Es geht einfacher: PHP getdate liefert alle Bestandteile eines Zeitpunkts in einem einzigen Aufruf als assoziatives Array.
Der Unterschied wird an einem kurzen Vergleich sofort sichtbar.
PHP getdate(): ein Aufruf statt vieler date()-Aufrufe
PHP getdate braucht keinen Parameter, wenn es um den aktuellen Zeitpunkt geht. Was zurückkommt, ist ein Array mit sprechenden Schlüsseln.
<?php
$heute = getdate();
echo $heute['mday'] . '.' . $heute['mon'] . '.' . $heute['year'];
echo ' ist ein ' . $heute['weekday'];
/* Statt: date('j') . '.' . date('n') . '.' . date('Y') */
Neben der kürzeren Schreibweise gibt es einen zweiten, wichtigeren Vorteil. Drei getrennte date()-Aufrufe holen die aktuelle Zeit dreimal. Passiert dazwischen ein Tageswechsel, stammen die Werte aus zwei verschiedenen Tagen. Ein einziger Aufruf von PHP getdate kann dieses Problem nicht haben, weil alle Werte aus demselben Zeitpunkt kommen.
Damit stellt sich die Frage, was genau in dem Array steht.
Alle Schlüssel, die PHP getdate() zurückgibt
Elf Einträge liefert PHP getdate, und die Hälfte davon erklärt sich nicht von selbst. Am schnellsten geht das Verständnis über eine vollständige Ausgabe.
<?php
print_r(getdate(1767225600));
/* Array (
[seconds] => 0
[minutes] => 0
[hours] => 1
[mday] => 1
[wday] => 4
[mon] => 1
[year] => 2026
[yday] => 0
[weekday] => Thursday
[month] => January
[0] => 1767225600
) */
Die folgende Tabelle ordnet jeden Schlüssel ein. Besonders lohnt der Blick auf die drei Abkürzungen, die in fremdem Code am häufigsten für Stirnrunzeln sorgen.
| Schlüssel | Beispiel | Bedeutung |
seconds | 0 bis 59 | Sekunde der Minute |
minutes | 0 bis 59 | Minute der Stunde |
hours | 0 bis 23 | Stunde im 24-Stunden-Format |
mday | 1 bis 31 | Tag im Monat, das m steht für month |
wday | 0 bis 6 | Wochentag als Zahl, 0 ist Sonntag |
mon | 1 bis 12 | Monat als Zahl |
year | 2026 | Vierstelliges Jahr |
yday | 0 bis 365 | Tag im Jahr, beginnt bei 0 |
weekday | Thursday | Wochentag ausgeschrieben, immer englisch |
month | January | Monatsname ausgeschrieben, immer englisch |
0 | 1767225600 | Der Zeitstempel selbst |
Zwei Zeilen dieser Tabelle sind Fehlerquellen. wday beginnt bei Sonntag, was der europäischen Gewohnheit widerspricht, und yday fängt bei 0 an, der 1. Januar hat also nicht die 1. Wer das übersieht, liegt jeweils genau um eins daneben.
Mit PHP getdate() ein beliebiges Datum zerlegen
Der optionale erste Parameter wird häufig übersehen, macht die Funktion aber erst richtig brauchbar. Statt der aktuellen Zeit lässt sich jeder Zeitstempel zerlegen.
<?php
$zeitpunkt = strtotime('2026-12-24 18:30:00');
$weihnachten = getdate($zeitpunkt);
printf(
'Heiligabend faellt auf einen %s, Tag %d des Jahres',
$weihnachten['weekday'],
$weihnachten['yday'] + 1
);
Das + 1 hinter yday ist kein Schreibfehler, sondern die Korrektur der Zählung ab null. Woher der Zeitstempel kommt, spielt keine Rolle: aus strtotime(), aus mktime() oder direkt aus der Datenbank. Wie sich Datumsangaben in Zeitstempel verwandeln lassen, zeigt das Tutorial zu PHP strtotime(), und der klassische Weg über Einzelwerte steht unter Datum in einen Timestamp umwandeln.
Praxisbeispiel: Begrüssung nach Tageszeit
Ein typischer Einsatz braucht nur ein einziges Feld aus dem Array. Weil ohnehin alle Werte vorliegen, ist der Rest der Ausgabe umsonst zu haben.
<?php
$jetzt = getdate();
$stunde = $jetzt['hours'];
$gruss = match (true) {
$stunde < 11 => 'Guten Morgen',
$stunde < 18 => 'Guten Tag',
default => 'Guten Abend',
};
echo $gruss . ', heute ist ' . $jetzt['weekday'];
Damit die Ausgabe nicht mitten im deutschen Satz englisch wird, braucht es eine Zuordnung. Die Zahl aus wday passt dabei genau auf den Index eines Arrays, das bei Sonntag beginnt.
<?php
$tage = [
'Sonntag', 'Montag', 'Dienstag', 'Mittwoch',
'Donnerstag', 'Freitag', 'Samstag',
];
$heute = getdate();
/* wday zaehlt ab Sonntag mit 0, passt genau auf den Index */
echo $tage[$heute['wday']];
Wer es sauberer mag, nimmt statt der eigenen Liste den IntlDateFormatter, der die Namen aus den Systemdaten holt. Für die meisten Anwendungen reicht das Array völlig, und es kommt ohne zusätzliche Erweiterung aus.
Datumslogik testbar machen
Der Zeitstempel-Parameter hat noch eine zweite, unterschaetzte Wirkung: er macht datumsabhängigen Code prüfbar. Eine Funktion, die sich die Zeit selbst holt, lässt sich nicht sinnvoll testen. Eine Funktion, die den Zeitpunkt entgegennimmt, schon.
<?php
/* Schlecht: holt die Zeit selbst, laesst sich nicht pruefen */
function istWochenendeSchlecht(): bool
{
$tag = getdate()['wday'];
return $tag === 0 || $tag === 6;
}
/* Gut: der Zeitpunkt kommt von aussen */
function istWochenende(?int $zeitstempel = null): bool
{
$tag = getdate($zeitstempel ?? time())['wday'];
return $tag === 0 || $tag === 6;
}
var_dump(istWochenende(strtotime('2026-08-15'))); /* Samstag: true */
var_dump(istWochenende(strtotime('2026-08-17'))); /* Montag: false */
Der Aufwand ist ein zusätzlicher Parameter mit Vorgabewert, der Gewinn sind Tests, die auch am Monatsersten und am 29. Februar noch grün sind. PHP getdate selbst bleibt dabei unverändert, es bekommt nur den Zeitpunkt gereicht statt ihn zu holen.
Drei Grenzen von PHP getdate()
1. Die Zeitzone kommt vom Server Die Funktion rechnet mit der Zeitzone aus date_default_timezone_get(). Sitzt der Server in einer anderen Zone als der Nutzer, stimmt das Ergebnis für ihn nicht. Wer je Nutzer unterschiedliche Zeiten braucht, ist mit DateTime und DateTimeZone besser bedient.
2. Es gibt keine Übersetzung Die Felder weekday und month sind immer englisch, unabhängig von jeder Spracheinstellung. Deutsche Namen brauchen eine eigene Zuordnung oder den IntlDateFormatter.
3. Die Kalenderwoche fehlt Im Array steckt keine Kalenderwoche. Dafür ist date('W') zuständig, das die Zählung nach ISO 8601 liefert. Wie sich daraus Start- und Enddatum berechnen lassen, steht im Tutorial zur Kalenderwoche in PHP.
PHP getdate() oder DateTime: was wann?
Eine Frage taucht regelmässig auf: ist PHP getdate veraltet, weil es die objektorientierte Datumswelt gibt? Die Antwort ist nein. Die Funktion ist nicht abgekündigt und macht ihre Aufgabe gut. Sie ist nur begrenzt: sie zerlegt, sie rechnet nicht.
Sobald Tage addiert, Zeiträume verglichen oder Zeitzonen umgerechnet werden sollen, ist DateTime das richtige Werkzeug. Es kennt Zeitzonen als Objekt, rechnet mit DateInterval und formatiert selbst. Wer nur wissen will, welcher Wochentag heute ist, braucht davon nichts. Der Vergleich beider Wege steht ausführlich im Tutorial zu PHP DateTime.
Die folgende Übersicht fasst den Weg von der Frage bis zur passenden Funktion zusammen.
flowchart TD
A[Datum wird gebraucht] --> B{Zeitpunkt bekannt?}
B -->|Nein| C[time verwenden]
B -->|Ja| D[strtotime oder Zeitstempel]
C --> E[getdate mit Zeitstempel]
D --> E
E --> F[Array mit elf Schluesseln]
F --> G{Was wird gebraucht?}
G -->|Einzelteile| H[mday mon year hours]
G -->|Wochentag| I[wday oder weekday]
G -->|Rechnen| J[Besser DateTime nutzen]
Fazit
PHP getdate zerlegt einen Zeitpunkt in einem Aufruf in alle seine Bestandteile. Das spart mehrfache date()-Aufrufe und schliesst nebenbei die Lücke aus, dass Werte aus zwei verschiedenen Sekunden stammen.
Wer die elf Schlüssel einmal gesehen hat, muss bei mday und wday nicht mehr raten. Zwei Details bleiben hängen: der Wochentag zählt ab Sonntag, und der Tag im Jahr beginnt bei null. Dazu kommen die drei Grenzen, nämlich Serverzeitzone, englische Namen und fehlende Kalenderwoche.
Für das reine Zerlegen eines Zeitpunkts ist die Funktion die einfachste Lösung, die PHP bietet. Sobald gerechnet wird, übernimmt DateTime. Und wer den Zeitstempel von aussen hereinreicht statt ihn in der Funktion zu holen, bekommt testbaren Code gratis dazu.