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 референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
easter_date
Референца за `function.easter-date.php` со подобрена типографија и навигација.
easter_date
(PHP 4, PHP 5, PHP 7, PHP 8)
easter_date — Добијте Unix временски печат за локално полноќ на Велигден за дадена година
= NULL
Враќа Unix временски печат што одговара на полноќ на Велигден за дадената година.
Датумот на Велигден е дефиниран од Советот во Никеја во 325 година како Недела по првата полна месечина што паѓа на или по Пролетната рамнодневница. Рамнодневницата се претпоставува дека секогаш паѓа на 21 март, така што пресметката се сведува на одредување на датумот на полната месечина и датумот на следната Недела. Алгоритмот што се користи овде е воведен околу 532 година од страна на Дионисиј Екзигус. Според Јулијанскиот календар (за години пред 1753) се користи едноставен 19-годишен циклус за следење на фазите на Месечината. Според Грегоријанскиот календар (за години по 1753 - измислен од Клавиус и Лилиус, и воведен од Папата Григориј XIII во октомври 1582 година, и во Британија и нејзините тогашни колонии во септември 1752 година) се додаваат два корективни фактори за да се направи циклусот попрецизен.
Параметри
year-
Годината мора да биде број помеѓу 1970 и 2037 за 32-битни системи, или помеѓу 1970 и 2.000.000.000 за 64-битни системи. Ако е изоставен или
null, стандардно се зема тековната година според локалното време. mode-
Овозможува пресметување на датумите на Велигден врз основа на Јулијанскиот календар кога е поставено на
CAL_EASTER_ALWAYS_JULIAN. Погледнете исто така константи на календарот.
Вратени вредности
Датумот на Велигден како unix временски печат.
Errors/Exceptions
А ValueError се фрла ако годината е порано од 1970 или подоцна од 2037 кога работи на 32-битен систем, или подоцна од 2.000.000.000 на 64-битен систем.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.3.0 |
На 64-битни системи, year параметарот сега прифаќа вредности во опсег од 1970 до 2.000.000.000.
|
| 8.0.0 |
year сега е null.
|
| 8.0.0 |
А ValueError се фрла кога
year е надвор од дозволениот опсег. Претходно, E_WARNING беше подигнато и функцијата врати false.
|
Примери
Пример #1 easter_date() example
<?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
?>Пример #2 Користење easter_date() with DateTime
<?php
$timestamp = easter_date(2023);
$datetime = new \DateTime();
$datetime->setTimestamp($timestamp);
echo $datetime->format('M-d-Y'); // Apr-09-2023
?>Белешки
Забелешка:
easter_date() се потпира на функциите за време на C библиотеката на вашиот систем, наместо да користи внатрешни функции за датум и време на PHP. Како последица на тоа, easter_date() користи
TZпроменлива на околината за да го одреди временскиот појас во кој треба да работи, наместо да го користи стандардниот временски појас на PHP , што може да резултира со неочекувано однесување кога се користи оваа функција во комбинација со други функции за датум во PHP.Како заобиколно решение, можете да го користитеза да го пресметате почетокот на Велигден во вашиот PHP временски појас на следниов начин: easter_days() with DateTime and DateInterval to calculate the start of Easter in your PHP time zone as follows:
<?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("Easter in %d is on %s\n",
$year,
get_easter_datetime($year)->format('F j'));
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Easter in 2012 is on April 8 Easter in 2013 is on March 31 Easter in 2014 is on April 20 Easter in 2015 is on April 5
Види Исто така
- easter_days() - Добијте број на денови по 21 март на кој паѓа Велигден за дадена година - Земи го бројот на денови по 21 март на кој паѓа Велигден за дадена година
Белешки од корисници 6 белешки
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) - 2I 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;
}
?>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.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;
}
?>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);
}
?>