PHP 8.6.0 Beta 1 is available for testing

easter_date

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

easter_dateПолучает метку времени Unix, которая соответствует местной полночи на Пасху в заданном году

Описание

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

Функция возвращает метку времени Unix, которая соответствует местной полночи на Пасху в заданном году.

Дату Пасхи установили на Первом Никейском соборе в 325 году до н. э. в честь воскресенья, которое следовало за полнолунием, которое наступило в день или после весеннего равноденствия. Древние считали, что День весеннего равноденствия всегда наступает 21 марта, поэтому расчёт дня Пасхи сводился к определению даты полнолуния и следующего за ней воскресенья. Алгоритм, которым пользуется функция, ввёл Дионисий Малой около 532 года. В юлианском летоисчислении (до 1753 года) для отслеживания фаз луны брали простой 19-летний цикл. В григорианском календаре (годы после 1753 — разработал Христофор Клавиус и Алоизий Лилиус, а ввёл Папа Григорий XIII в октябре 1582, а в Великобритании и её колониях в сентябре 1752 г.) добавили 2 поправочных коэффициента, которые увеличили точность расчёта дат.

Список параметров

year

Год указывается как число от 1970 до 2037 для 32-битных или 2 000 000 000 для 64-битных систем. Функция возьмёт текущий год по местному времени, если год не указали или значение параметра равно null .

mode

Разрешает рассчитывать даты Пасхи на основе Юлианского календаря, если установили значение CAL_EASTER_ALWAYS_JULIAN . Смотрите также константы календаря.

Возвращаемые значения

Функция возвращает дату Пасхи в виде метки времени Unix.

Ошибки

Функция выбросит ошибку ValueError , если значение года окажется меньше 1970 или больше 2037 для 32-битных или 2 000 000 000 для 64-битных систем.

Список изменений

Версия Описание
8.3.0 На 64-битных системах параметр year теперь принимает значения в диапазоне от 1970 до 2 000 000 000.
8.0.0 Параметр year теперь принимает значение null .
8.0.0 Функция выбрасывает ошибку ValueError , если значение параметра year выходит за пределы допустимого диапазона. Раньше вызывалась ошибка уровня E_WARNING и функция возвращала false .

Примеры

Пример #1 Пример получения метки времени Unix функцией easter_date()

<?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 Пример получения метки времени Unix функцией easter_date() с объектом класса DateTime

<?php
$timestamp = easter_date(2023);
$datetime = new \DateTime();
$datetime->setTimestamp($timestamp);
echo $datetime->format('M-d-Y'); // Apr-09-2023
?>

Примечания

Замечание:

Функция easter_date() полагается не на внутренние PHP-функции, которые работают с датой и временем, а на системные функции библиотеки языка Си. Поэтому для определения часового пояса, в котором она должна работать, функция easter_date() использует переменную окружения TZ, а не часовой пояс по умолчанию, который установили в PHP, что иногда приводит к неожиданному поведению в сочетании с другими функциями PHP для работы с датами.

Как обходным путём для расчёта начала Пасхи в текущем часовом поясе PHP пользуются функцией easter_days() с объектами классов DateTime и DateInterval :

<?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(
 "Пасха в %d году приходится на %s\n",
 $year,
 get_easter_datetime($year)->format('F j')
 );
}
?>

Результат выполнения приведённого примера:

Пасха в 2012 году приходится на April 8
Пасха в 2013 году приходится на March 31
Пасха в 2014 году приходится на April 20
Пасха в 2015 году приходится на April 5

Смотрите также

  • easter_days() - Получает количество дней между 21 марта и Пасхой в заданном году для расчёта дня Пасхи до 1970 или после 2037 года

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 6 notes

up
30
maxie
18 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
10
Alexander Bliznyuk
8 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
16 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
13 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
21 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
12 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);
 }
?>
+Добавить

AltStyle によって変換されたページ (->オリジナル) /