W3docs

easter_date()

Osterdatum in PHP berechnen mit easter_date() und easter_days() – mit zeitzonen-sicheren Beispielen und Erklärungen.

Einführung

Das programmatische Berechnen des Osterdatums ist eine überraschend häufige Aufgabe – Kalender-Apps, Planungssysteme und Lohnbuchhaltungssoftware müssen alle wissen, auf welchen Tag im Jahr Ostern fällt, da sich das Datum jedes Jahr verschiebt. PHP liefert zwei eingebaute Funktionen dafür: easter_date() und easter_days(). Dieses Kapitel erklärt, wie Ostern berechnet wird, wie sich jede Funktion verhält und welche man verwenden sollte, um Zeitzonenprobleme zu vermeiden.

Warum das Osterdatum variiert

Ostern ist ein bewegliches Fest: Anders als Weihnachten hat es kein festes Kalenderdatum. Nach der Regelung des Konzils von Nicäa im Jahr 325 n. Chr. ist Ostersonntag der erste Sonntag nach dem ersten Vollmond am oder nach der Frühlings-Tagundnachtgleiche. Da dies vom Mondkalender abhängt, schwankt das Datum von Jahr zu Jahr zwischen dem 22. März und dem 25. April.

PHP implementiert den standardisierten Computus-Algorithmus intern, sodass Sie die Mondphase nie selbst berechnen müssen.

easter_date()

easter_date() gibt den Unix-Zeitstempel für den Ostersonntag eines bestimmten Jahres zurück.

  • Signatur: easter_date(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int
  • Parameter: Das vierstellige $year (Standard ist das aktuelle Jahr). Das optionale $mode wählt die gregorianische oder julianische Berechnung.
  • Rückgabewert: Ein Unix-Zeitstempel für den Ostersonntag.

Hinweis: Ein häufiger Fehler ist, einen Zeitstempel an easter_date() zu übergeben. Das Argument ist ein Jahr (z. B. 2023), kein Zeitstempel. Das Übergeben von mktime(...) liefert ein falsches Ergebnis.

Der Fallstrick liegt bei Zeitzonen. Der zurückgegebene Zeitstempel zeigt auf Mittag UTC des Ostersonntags. Wenn man ihn mit date() unter einer Standard-Zeitzone westlich von UTC formatiert, kann sich das Ergebnis auf den vorherigen Tag verschieben. Für die Ausgabe empfiehlt sich der weiter unten beschriebene easter_days()-Ansatz.

easter_days()

easter_days() gibt die Anzahl der Tage nach dem 21. März zurück, auf die Ostern fällt – statt eines Zeitstempels. Dies ist der zeitzonen-sichere Baustein: Kombiniert mit einem einfachen Kalenderdatum ergibt sich der korrekte Tag, unabhängig von date_default_timezone_set().

  • Signatur: easter_days(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int
  • Rückgabewert: Ein ganzzahliger Versatz (z. B. bedeutet 19, dass es der 21. März + 19 Tage ist).

Verfügbarkeit: easter_date() und easter_days() sind Teil der PHP-Kalendererweiterung. Sie wurden in PHP 8.0 in den Core verschoben und sind in aktuellem PHP (8.x) weiterhin verfügbar – sie wurden nicht entfernt. Wenn Sie auf einem älteren Build Call to undefined function easter_date() sehen, aktivieren Sie die calendar-Erweiterung.

Beispielcode

Empfohlen – zeitzonen-sicher via easter_days()

<?php

$year = 2023;
$easter = (new DateTimeImmutable("$year-03-21"))
    ->modify('+' . easter_days($year) . ' days');

echo $easter->format('F j, Y'); // Outputs: April 9, 2023

Schnelle Einzeiler-Variante mit easter_date()

<?php

$year = 2023;
echo date('F j, Y', easter_date($year));

easter_date() verankert den Zeitstempel auf Mittag UTC, sodass der angezeigte Kalendertag von der Formatierungs-Zeitzone abhängt – beachten Sie, dass dasselbe Jahr unten unterschiedlich ausgegeben wird. Genau deshalb ist die easter_days()-Version oben die sicherere Wahl:

<?php

date_default_timezone_set('UTC');
echo date('F j, Y H:i', easter_date(2024)); // Outputs: March 30, 2024 20:00

Weiterführende Lektüre

Fazit

Ostern ist ein bewegliches Fest, daher muss sein Datum jedes Jahr aus dem Mondkalender berechnet werden. PHP übernimmt die aufwendige Mathematik durch die Kalendererweiterung. Für Anzeige-Code bevorzugen Sie easter_days() in Kombination mit einem DateTimeImmutable, damit das Ergebnis von der Server-Zeitzone unbeeinflusst bleibt; verwenden Sie easter_date() für einen schnellen Zeitstempel, wenn Sie die Standard-Zeitzone kontrollieren.

Übung

Übung
Was gibt die Funktion easter_date() in PHP zurück?
Was gibt die Funktion easter_date() in PHP zurück?
Was this page helpful?