easter_date

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

easter_dateObtém o timestamp Unix para a meia-noite local da Páscoa de um ano informado

Descrição

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

Retorna o timestamp Unix correspondente à meia-noite local da Páscoa do ano informado.

A data do Dia de Páscoa foi definida pelo Concílio de Niceia no ano 325 D.C. como o domingo após a primeira lua cheia que cai no equinócio de primavera ou depois dele. Assume-se que o equinócio seja sempre no dia 21 de março, portanto o cálculo se reduz a determinar a data da lua cheia e a data do domingo seguinte. O algoritmo usado aqui foi introduzido por volta do ano 532 por Dionísio, o exíguo. Sob o calendário Juliano (para anos anteriores a 1753), um ciclo simples de 19 anos é usado para acompanhar as fases da lua. Sob o calendário Gregoriano (para anos posteriores a 1753 - concebido por Cristóvão Clávio e Luís Lílio, e introduzido pelo Papa Gregório XIII em outubro de 1582, e na Grã-Bretanha e suas então colônias em setembro de 1752), dois fatores de correção são adicionados para deixar o ciclo mais preciso.

Parâmetros

year

O ano deve ser um número entre 1970 e 2037 para sistemas de 32 bits, ou entre 1970 e 2.000.000.000 para sistemas de 64 bits. Se omitido ou null, será usado o padrão que é o ano atual conforme o horário local.

mode

Permite que datas de Páscoa sejam calculadas com base no calendário Juliano quando definido para CAL_EASTER_ALWAYS_JULIAN. Consulte também as constantes de calendário.

Valor Retornado

A data da Páscoa como um timestamp Unix.

Erros/Exceções

Uma exceção ValueError é lançada se o ano for anterior a 1970 ou posterior a 2037 em sistemas de 32 bits, ou posterior a 2.000.000.000 em sistemas de 64 bits.

Registro de Alterações

Versão Descrição
8.3.0 Em sistemas de 64 bits, o parâmetro year agora aceita valores na faixa de 1970 a 2.000.000.000.
8.0.0 year agora pode ser nulo.
8.0.0 Uma exceção ValueError agora é lançada quando year estiver fora do intervalo permitido. Anteriormente, um E_WARNING era emitido e a função retornava false.

Exemplos

Exemplo #1 Exemplo de 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

?>

Exemplo #2 Usando easter_date() com DateTime

<?php

$timestamp
= easter_date(2023);

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

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

?>

Notas

Nota:

easter_date() depende das funções de horário da biblioteca C do sistema, ao invés de usar as funções de data e horário internas do PHP. Como uma consequência, easter_date() usa a variável de ambiente TZ para determinar o fuso horário onde ela deve operar, ao invés de usar o fuso horário padrão do PHP, o que pode retultar em comportamento inesperado ao usar esta função em conjunto com outras funções de data no PHP.

Como uma maneira de contornar isso, pode-se usar easter_days() com DateTime e DateInterval para calcular o início da Páscoa no fuso horário do PHP como no exemplo a seguir:

<?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("Páscoa em %d é no dia %s\n",
$year,
get_easter_datetime($year)->format('d/m'));
}
?>

O exemplo acima produzirá:

Páscoa em 2012 é no dia 08/04
Páscoa em 2013 é no dia 31/03
Páscoa em 2014 é no dia 20/04
Páscoa em 2015 é no dia 05/04

Veja Também

  • easter_days() - Obtém o número de dias depois de 21 de março no qual a Páscoa cai para um determinado ano para cálculo da Páscoa antes de 1970 ou depois de 2037

adicione uma nota

Notas Enviadas por Usuários (em inglês) 6 notes

up
30
maxie
17 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
15 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
12 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
11 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):<?phpfunction 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