easter_date

(PHP 4, PHP 5)

easter_dateGet Unix timestamp for midnight on Easter of a given year

Description

int easter_date ([ int $year ] )

Returns the Unix timestamp corresponding to midnight on Easter of the given year.

Warning

This function will generate a warning if the year is outside of the range for Unix timestamps (i.e. before 1970 or after 2037).

The date of Easter Day was defined by the Council of Nicaea in AD325 as the Sunday after the first full moon which falls on or after the Spring Equinox. The Equinox is assumed to always fall on 21st March, so the calculation reduces to determining the date of the full moon and the date of the following Sunday. The algorithm used here was introduced around the year 532 by Dionysius Exiguus. Under the Julian Calendar (for years before 1753) a simple 19-year cycle is used to track the phases of the Moon. Under the Gregorian Calendar (for years after 1753 - devised by Clavius and Lilius, and introduced by Pope Gregory XIII in October 1582, and into Britain and its then colonies in September 1752) two correction factors are added to make the cycle more accurate.

Parameters

year

The year as a number between 1970 an 2037

Return Values

The easter date as a unix timestamp.

Changelog

Version Description
4.3.0 The year parameter is optional and defaults to the current year according to the local time if omitted.

Examples

Example #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

?>

Notes

Note:

easter_date() relies on your system's C library time functions, rather than using PHP's internal date and time functions. As a consequence, easter_date() uses the TZ environment variable to determine the time zone it should operate in, rather than using PHP's default time zone, which may result in unexpected behaviour when using this function in conjunction with other date functions in PHP.

As a workaround, you can use the 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(20122015) as $year) {
    
printf("Easter in %d is on %s\n",
           
$year,
           
get_easter_datetime($year)->format('F j'));
}
?>

The above example will output:

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

See Also

  • easter_days() - Get number of days after March 21 on which Easter falls for a given year for calculating Easter before 1970 or after 2037

Коментарии

Автор:
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)*(- (int)($H 28)*(int)(29 / ($H 1))*((int)(21 $G) / 11)); 
         
$J = ($Year + (int)($Year/4) + $I $C + (int)($C/4)) % 7
         
$L $I $J
         
$m + (int)(($L 40) / 44); 
         
$d $L 28 31 * ((int)($m 4)); 
         
$y $Year
         
$E mktime(0,0,0$m$d$y); 

         return 
$E

   } 
?>
2004-11-08 10:17:16
http://php5.kiev.ua/manual/ru/function.easter-date.html
Автор:
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 = ($a $b $d 34) % 7;
   
$month floor(($d $e 114) / 31);
   
$day = (($d $e 114) % 31) + 1;
   
   
$de mktime(000$month$day 13$year);
   
    return 
$de;
}
?>
2008-06-12 04:36:46
http://php5.kiev.ua/manual/ru/function.easter-date.html
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(00011$year),  // 1er janvier
   
mktime(00051$year),  // Fête du travail
   
mktime(00058$year),  // Victoire des alliés
   
mktime(000714$year),  // Fête nationale
   
mktime(000815$year),  // Assomption
   
mktime(000111$year),  // Toussaint
   
mktime(0001111$year),  // Armistice
   
mktime(0001225$year),  // Noel

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

 
sort($holidays);
 
  return 
$holidays;
}
?>
2010-03-11 09:44:45
http://php5.kiev.ua/manual/ru/function.easter-date.html
Автор:
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.
2013-03-30 10:13:56
http://php5.kiev.ua/manual/ru/function.easter-date.html
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==|| $weekDay==|| in_array(date('m-d',$date1),$hol)))
               
$i++;

           
$date1=strtotime('+1 day',$date1);
        }
        return 
date('Y-m-d',$date1);
    }
?>
2014-04-10 18:01:22
http://php5.kiev.ua/manual/ru/function.easter-date.html
Автор:
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
2017-08-24 01:02:42
http://php5.kiev.ua/manual/ru/function.easter-date.html

    Поддержать сайт на родительском проекте КГБ