PHP 8.4.1 Released!

easter_date

(PHP 4, PHP 5, PHP 7, PHP 8)

easter_dateZeitpunkt des Osterfestes (0 Uhr) als Unix-Timestamp

Beschreibung

easter_date(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int

Diese Funktion gibt den Unix-Timestamp (in Sekunden seit 1970) zurück, der dem Begin des Ostersonntag im durch year spezifizierten Jahr entspricht.

Das Datum des Osterfestes wurde im Jahre 325 auf dem Konzil von Nicaea auf den ersten Sonntag nach Frühlingsvollmond, also dem Vollmond während oder direkt nach der Tagundnachtgleiche am 21. März, festgelegt. Der hier genutzte Algorithmus wurde um das Jahr 532 von Dionysius Exiguus eingeführt. Bis zum Jahr 1752 wird nach dem Julianischen Kalender ein einfacher 19jähriger Zyklus für die Bestimmung der Mondphasen benutzt. Im September 1752 übernahmen dann auch Britannien und seine Kolonien den von Clavius und Lilius vorgeschlagenen und im Oktober 1582 von Papst Gregor dem XIII. eingeführten Gregorianischen Kalender. Hierdurch wurden zwei Korrekturfaktoren eingeführt, um den Zyklus genauer abzubilden.

Parameter-Liste

year

Das Jahr muss auf 32-Bit-Systemen eine Zahl zwischen 1970 und 2037 sein und auf 64-Bit-Systemen eine Zahl zwischen 1970 und 2.000.000.000. Wenn nicht angegeben oder null, wird das aktuelle Jahr gemäß der lokalen Zeit verwendet.

mode

Ermöglicht die Berechnung des Osterdatums basierend auf dem Julianischen Kalender, wenn auf CAL_EASTER_ALWAYS_JULIAN gesetzt. Siehe auch Kalender-Konstanten.

Rückgabewerte

Das Osterdatum als Unix-Timestamp.

Fehler/Exceptions

Wenn auf einem 32-bit System eine Jahreszahl vor 1970 oder nach 2037 oder auf einem 64-Bit-System eine Jahreszahl nach 2.000.000.000 angegeben wird, wird ein ValueError geworfen.

Changelog

Version Beschreibung
8.3.0 Auf 64-Bit-Systemen akzeptiert der Parameter Jahr nun Werte innerhalb des Bereichs von 1970 bis 2.000.000.000.
8.0.0 year ist jetzt nullbar.
8.0.0 Wenn year außerhalb des zulässigen Bereichs liegt, wird nun ein ValueError geworfen; zuvor wurde ein Fehler der Stufe E_WARNING ausgegeben und die Funktion gab false zurück.

Beispiele

Beispiel #1 easter_date()-Beispiel

<?php

echo date("M-d-Y", easter_date(1999)); // Apr-04-1999
echo date("M-d-Y", easter_date(2000)); // Apr-23-2000
echo date("M-d-Y", easter_date(2001)); // Apr-15-2001

?>

Beispiel #2 Verwendung von easter_date() mit DateTime

<?php

$timestamp
= easter_date(2023);

$datetime = new \DateTime();
$datetime->setTimestamp($timestamp);

echo
$datetime->format('M-d-Y'); // Apr-09-2023

?>

Anmerkungen

Hinweis:

easter_date() verlässt sich auf die Zeitfunktionen der C-Bibliothek des Systems, anstatt die internen Datums- und Zeitfunktionen von PHP zu verwenden. Infolgedessen verwendet easter_date() die Umgebungsvariable TZ, um die Zeitzone zu bestimmen, in der sie arbeiten soll, anstatt die Standardzeitzone von PHP zu verwenden. Dies kann unerwartetes Verhalten zur Folge haben, wenn diese Funktion in Verbindung mit anderen Datumsfunktionen in PHP verwendet wird.

Als Workaround kann easter_days() mit DateTime und DateInterval verwendet werden, um den Beginn von Ostern in der von PHP eingestellten Zeitzone wie folgt zu berechnen:

<?php
function get_easter_datetime($year) {
$base = new DateTime("$year-03-21");
$days = easter_days($year);

return
$base->add(new DateInterval("P{$days}D"));
}

foreach (
range(2012, 2015) as $year) {
printf("Ostern %d ist am %s\n",
$year,
get_easter_datetime($year)->format('j.n.'));
}
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Ostern 2012 ist am 8.4.
Ostern 2013 ist am 31.3.
Ostern 2014 ist am 20.4.
Ostern 2015 ist am 5.4.

Siehe auch

  • easter_days() - Anzahl der Tage zwischen dem 21. März und Ostersonntag zur Berechnung des Osterdatums vor 1970 oder nach 2037

add a note

User Contributed Notes 6 notes

up
29
maxie
16 years ago
To compute the correct Easter date for Eastern Orthodox Churches I made a function based on the Meeus Julian algorithm:

<?php
function orthodox_eastern($year) {
$a = $year % 4;
$b = $year % 7;
$c = $year % 19;
$d = (19 * $c + 15) % 30;
$e = (2 * $a + 4 * $b - $d + 34) % 7;
$month = floor(($d + $e + 114) / 31);
$day = (($d + $e + 114) % 31) + 1;

$de = mktime(0, 0, 0, $month, $day + 13, $year);

return
$de;
}
?>
up
9
Alexander Bliznyuk
7 years ago
Thank you, @Maxie, for algorythm for computing Orthodox Easter date.
It can be improved though. You added 13 days in order to map Julian calendar to Gregorian. But 13 days is not a constant. It's an accumulated error fixed in Gregorian and should be calculated with this formula: (int)($year / 100) - (int)($year / 400) - 2
up
11
py dot lebecq at gmail dot com
14 years ago
I recently had to write a function that allows me to know if today is a holiday.

And in France, we have some holidays which depends on the easter date. Maybe this will be helpful to someone.

Just modify in the $holidays array the actual holidays dates of your country.

<?php
/**
* This function returns an array of timestamp corresponding to french holidays
*/
protected static function getHolidays($year = null)
{
if (
$year === null)
{
$year = intval(date('Y'));
}

$easterDate = easter_date($year);
$easterDay = date('j', $easterDate);
$easterMonth = date('n', $easterDate);
$easterYear = date('Y', $easterDate);

$holidays = array(
// These days have a fixed date
mktime(0, 0, 0, 1, 1, $year), // 1er janvier
mktime(0, 0, 0, 5, 1, $year), // Fête du travail
mktime(0, 0, 0, 5, 8, $year), // Victoire des alliés
mktime(0, 0, 0, 7, 14, $year), // Fête nationale
mktime(0, 0, 0, 8, 15, $year), // Assomption
mktime(0, 0, 0, 11, 1, $year), // Toussaint
mktime(0, 0, 0, 11, 11, $year), // Armistice
mktime(0, 0, 0, 12, 25, $year), // Noel

// These days have a date depending on easter
mktime(0, 0, 0, $easterMonth, $easterDay + 2, $easterYear),
mktime(0, 0, 0, $easterMonth, $easterDay + 40, $easterYear),
mktime(0, 0, 0, $easterMonth, $easterDay + 50, $easterYear),
);

sort($holidays);

return
$holidays;
}
?>
up
1
Guillaume Dufrene
11 years ago
I found a problem with holidays timestamp computation and daylight saving time.
An article about it at http://goo.gl/76t31 (in french only, sorry).

In summary, this year (2013) easter begins before adding an hour for daylight saving time (occured sunday at 3:00). It means that if you do $easter + X, where x is a number of seconds equivalent to one day, 39 days or 50 days, the result is not equals to a midnight timestamp...

Here a function to check if a midnight timestamp is equals to an holiday :

function isHoliday( $ts ) {
// Licence : Creative Commons (BY)
// By Webpulser - http://goo.gl/76t31
$fixed_holidays = array( ’01-01′, ’01-05′, ’08-05′, ’14-07′, ’15-08′, ’11-11′, ’25-12′ );
$format = ‘d-m’;

$dm = date($format, $ts);
if ( in_array($dm, $fixed_holidays) ) return true;

$easter = easter_date( date(‘Y’, $ts) );
if ( date($format, $easter + 86400) == $dm ) return true;
if ( date($format, $easter + 3369600) == $dm ) return true;
if ( date($format, $easter + 4320000) == $dm ) return true;

return false;
}

feel free to use / modify.
up
-1
phpuser
20 years ago
The algorithm from Bigtree is correct if you add some (int) cast
<?php
function easter_date ($Year) {

/*
G is the Golden Number-1
H is 23-Epact (modulo 30)
I is the number of days from 21 March to the Paschal full moon
J is the weekday for the Paschal full moon (0=Sunday,
1=Monday, etc.)
L is the number of days from 21 March to the Sunday on or before
the Paschal full moon (a number between -6 and 28)
*/


$G = $Year % 19;
$C = (int)($Year / 100);
$H = (int)($C - (int)($C / 4) - (int)((8*$C+13) / 25) + 19*$G + 15) % 30;
$I = (int)$H - (int)($H / 28)*(1 - (int)($H / 28)*(int)(29 / ($H + 1))*((int)(21 - $G) / 11));
$J = ($Year + (int)($Year/4) + $I + 2 - $C + (int)($C/4)) % 7;
$L = $I - $J;
$m = 3 + (int)(($L + 40) / 44);
$d = $L + 28 - 31 * ((int)($m / 4));
$y = $Year;
$E = mktime(0,0,0, $m, $d, $y);

return
$E;

}
?>
up
-3
adwil at live dot com
10 years ago
Hey, recently I needed a function to get realization dates in online shop, so here it is (ready to go for polish users, please adjust your dates for any other country):

<?php
function getWorkday($date1,$workDays) {
$workDays = (int)$workDays;
if (
$workDays <= 0)
return
null;

$date1=strtotime('-1 day',strtotime($date1));

$lastYear = null;
$hol=array('01-01','01-06','05-01','05-03','08-15','11-01','11-11','12-25','12-26'); //array of month-date of static holidays (these are from Poland)
$i = 0;
while (
$i<=$workDays) {
$year = date('Y', $date1);
if (
$year !== $lastYear){
$lastYear = $year;
$easter = date('m-d', easter_date($year));
$date = strtotime($year . '-' . $easter); // easter
$easterSec = date('m-d', strtotime('+1 day', $date)); // easter monday
$greens = date('m-d', strtotime('+49 days', $date)); // zielone swiatki
$cc = date('m-d', strtotime('+60 days', $date)); // boze cialo
$hol[] = $easter;
$hol[] = $easterSec;
$hol[] = $greens;
$hol[] = $cc;
}
$weekDay=date('w',$date1);
if (!(
$weekDay==0 || $weekDay==6 || in_array(date('m-d',$date1),$hol)))
$i++;

$date1=strtotime('+1 day',$date1);
}
return
date('Y-m-d',$date1);
}
?>
To Top