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;
}
?>
easter_date
(PHP 4, PHP 5)
easter_date — Získať UNIXový čas pre polnoc na Veľkú Noc daného roku
Popis
Vracia UNIXový čas zodpovedajúci polnoci na Veľkú Noc daného roku.
Od PHP 4.3.0 je parameter rok voliteľný a ak sa vynechá, tak je predvolene nastavený na súčasný rok podľa miestneho času.
Upozornenie: Táto funkcia bude generovať varovné hlásenia ak je rok mimo rozsah UNIXového času (t.j. pred 1970 alebo po 2037).
Example#1 easter_date() príklad
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" */
Dátum Veľkonočného dňa bol definovaný Radou Nicaea v 325 n.l. ako nedeľa po prvom splne, ktorý padá na jarnú rovnodennosť alebo po ňom. Rovnodennosť pripadá vždy na 21. marec, takže výpočet sa redukuje o určovanie dátumu po splne a dátumu následujúcej nedele. Tu použitý algoritmus bol predstavený okolo roku 532 Dionysiusom Exiguusom. V Juliánskom kalendári ( pre roky pred 1753) sa jednoduchý 19-ročný cyklus používa na sledovanie fáz Mesiaca. V Gregoriánskom kalendári (pre roky po roku 1753 - vymysleli ho Clavius a Lilius a predstavil ho Pápež Gregory XIII v októbri 1582, do Británie a jej kolónii v septembri 1752) sú pridané dva opravné faktory, aby sa cyklus urobil presnejším.
(Kód je založený na C programe od Simona Kershawa, <webmaster@ely.anglican.org>)
Pozri easter_days() pre výpočet Veľkej noci pred 1970 alebo po 2037.
easter_date
12-Jun-2008 01:36
28-Jan-2008 03:50
v5.2.1 - There is a known bug with easter_date() that can return incorrect dates for some years:
<?php
// 2008 OK
echo date("D d M Y", easter_date(2008)); // Sun 23 Mar 2008
// 2009 returns Saturday
echo date("D d M Y", easter_date(2009)); // Sat 11 Apr 2009
?>
However easter_days() works correctly:
<?php
echo date("D d M Y", strtotime("2009-03-21 +".easter_days(2009)." days")); // Sun 12 Apr 2009
?>
It is apparently related to timezone settings.
I made the function like this ... works fine !
<?php
function ostern
{
$maerz21=date('z',mktime(0,0,0,3,21,$jb));
$d=((15 + $jb/100 - $jb/400 - (8 * $jb/100 + 13) / 25)%30 + 19 * ($jb%19))%30;
if ($d==29)
{
$D=28;
}
elseif($d==28 && ($jb%17)>=11)
{
$D=27;
}
else $D=$d;
$e=(2 * ($jb%4) + 4 *($jb%7) + 6 * $D + (6 + $jb/100 - $jb/400 - 2)%7)%7;
$ostersonntag=$e+$D+1+$maerz21;
return $ostersonntag;
}
?>
08-Nov-2004 08:17
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;
}
?>
