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 マニュアルのmktime、strtotimeをご覧ください。
指定した年が閏年かどうか判定する
指定した年が閏年かどうか判定する関数を作ってみます。
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についてはこちら
参考
PHP Warning Illegal string offset 'foo'
PHPschedule2020-02-03
PHP Notice:Undefined indexの対処
PHPschedule2020-01-17
PHP compact関数で宣言していない変数の扱い
PHPschedule2020-01-15