easter_date

指定した年における復活祭の真夜中のUnix時を得る

説明

int easter_date(intnull $year = null, int $mode = CAL_EASTER_DEFAULT)

指定した年yearにおける復活祭の真夜中のUnix時を返します。

復活祭の日付は、西暦325年の Nicaea 会議で春分の日の後の 最初の満月の後の日曜日として定められました。 満月とその次の日曜日の日付の計算を簡単にするために 春分の日は常に3月21日になるとして計算されます。 ここで用いるアルゴリズムは、532年頃、Dionysius Exiguus により 導出されたものです。(1753年より前の年に関して)ユリウス暦の元では 月の周期を追うために簡単な19年周期が用いられます。グレゴリウス暦 (1753年以降。この暦は、ClaviusとLiliusにより考案され、 教皇グレゴリウス13世により1582年10月に導入、イギリス及びその植民地に 1752年9月に導入された。) のもとで、二つの補正係数が周期をより正確に作成するために追加されました。

パラメータ

year

年の値。32ビットのシステムでは、 1970 から 2037 までである必要があります。 64ビットのシステムでは、 1970 から 2,000,000,000 までである必要があります。 省略した場合、もしくは null の場合は、 デフォルトとしてローカルタイムにおける現在の年を使います。

mode

CAL_EASTER_ALWAYS_JULIAN を設定すると、 ユリウス暦のカレンダをベースにして復活祭の日付が計算できます。 calendar の定数 を参照ください。

戻り値

復活祭の日を Unix タイムスタンプで返します。

エラー / 例外

32ビットのシステムでは、year の値が 1970 より前か 2037 より後の場合、 ValueError がスローされます。 64ビットのシステムでは、year の値が 1970 より前か 2,000,000,000 より後の場合、 ValueError がスローされます。

変更履歴

バージョン 説明
8.3.0 64ビットのシステムでは、 year の値として 1970 から 2,000,000,000 までの値を受け入れるようになりました。
8.0.0 year は、nullable になりました。
8.0.0 year が範囲外の値の場合、 ValueError がスローされるようになりました。 これより前のバージョンでは、 E_WARNING が発生して false を返していました。

例1 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 easter_dateDateTime と一緒に使う

<?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 の他の日付関数と組み合わせて使ったときに予期せぬ結果になる可能性があります。

回避策として、easter_daysDateTimeDateInterval と組み合わせて使えば、PHP で設定したタイムゾーンにおける復活祭の開始時刻を算出できます。

<?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'));
}
?>

上の例の出力は以下となります。

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

参考

  • 1970年以前または2037年以降の復活祭の計算に関しては、 easter_days を参照ください。