schedule2019-05-21

閏年の判定date('L')|PHP

PHPで閏年を判定する式を紹介する。

動作確認:PHP 7.3

date('L')

date()に引数'L'を渡すと閏年かどうか判定できる。 date('L')では今年が閏年かどうか0または1を返します。

// 2019年05月20日現在
echo date('L');
// 0

if文を使って今年が閏年かどうか判定してみます。

if (date('L')){
    echo "閏年です。";
}else{
    echo "閏年ではありません。";
}
// 閏年ではありません。

date('L', timestamp)

date()にはUnixのタイムスタンプを渡すことができます。

「2020年01月01日00時00分00秒000ms」のUnixタイムスタンプは1577833200ですのでこれを渡してみます。

echo date('L', 1577833200);
// 1

ただ、これだと人間には解かりづらいためmktime()strtotime()を使います。

// 2020年01月01日00時00分00秒000ms

mktime(0,0,0,1,1,2020); // 1577833200

strtotime('2020-01-01'); // 1577833200
// strtotime('2020-01-01 00:00:00');と同様

詳しい使い方はそれぞれPHP マニュアルのmktimestrtotimeをご覧ください。

指定した年が閏年かどうか判定する

指定した年が閏年かどうか判定する関数を作ってみます。

mktimeの書式はmktime(時, 分, 秒, 月, 日, 年)です。 6個目の引数を変えれば指定した閏年の判定に使えます。

function is_leap_year($year){
    return date('L', mktime(0,0,0,1,1,$year))
}

あまり関数にする必要はなかったかも。

閏年を列挙する

西暦2020年から2110年までの閏年を列挙してみます。

中途半端なのは2100年は閏年ではないことも判定できるかどうか調べるためです。

// 2020から2110までの配列
$years = range(2020, 2111);

// 閏年をフィルタリング
$leap_years = array_filter($years, function($year) {
    return date('L', mktime(0,0,0,1,1,$year));
});

print_r($leap_years);

出力

Array
(
    [0] => 2020
    [4] => 2024
    [8] => 2028
    [12] => 2032
    [16] => 2036
    [20] => 2040
    [24] => 2044
    [28] => 2048
    [32] => 2052
    [36] => 2056
    [40] => 2060
    [44] => 2064
    [48] => 2068
    [52] => 2072
    [56] => 2076
    [60] => 2080
    [64] => 2084
    [68] => 2088
    [72] => 2092
    [76] => 2096
    [84] => 2104 // 2100年は閏年ではない
    [88] => 2108
)

2100年は閏年ではないこともちゃんと識別できていました。

array_filterについてはこちら

参考