PHP に限らず閏年の判定を行うことは頻繁にあります。どれが正解と言うことはありませんが、ここでは、PHP でうるう年の判定を行う 3通りの実装方法を紹介しています。
スポンサーリンク
DateTime クラスを使用する(PHP 5.2 以降)
/* * PHP 5.2 以降(DateTime クラスを使用する) */ function isLeap($year) { $date = new DateTime(); $date->setDate($year, 1, 1); $isLeap = $date->format('L'); return $isLeap ? true: false; } var_dump(isLeap(2008)); // boolean true var_dump(isLeap(2011)); // boolean false
checkdate 関数を使用する
/* * checkdate 関数を使用して閏年か調べる */ function isLeap2($year) { /* * 2月29日を正常な日付と認識するかどうかで調べる */ return checkdate(2, 29, $year); } var_dump(isLeap2(2008)); // boolean true var_dump(isLeap2(2011)); // boolean false
Zend_Date_DateObject::isYearLeapYear メソッド
Zend Framework の Zend_Date::checkLeapYear($year) メソッドでの閏年か否かの判定を行う実装方法を紹介します。
/** * Returns true, if given $year is a leap year. * * @param integer $year * @return boolean true, if year is leap year */ protected static function isYearLeapYear($year) { // all leapyears can be divided through 4 if (($year % 4) != 0) { return false; } // all leapyears can be divided through 400 if ($year % 400 == 0) { return true; } else if (($year > 1582) and ($year % 100 == 0)) { return false; } return true;0 }
上記での注目点は 1582 年以降のみ 100 で割り切れる年は平年として扱っていることです。つまり、1500 年は閏年であり、1700 年は閏年ではないということになります。
1582 年はグレゴリオ暦が制定された年であり、ZendFramework ではそれが実装に反映されているものと思われます。一方日本では、神武天皇即位紀元(皇紀)を元に閏年の判断を行うらしく、(詳細は不明ですが)1582 年は判断基準にはならないようにも思います。
.Net Framework での実装は
参考までに .Net Framework での閏年の判断はどのようになっているか確認してみます。.Net Framework では 閏年の判断は DateTime.IsLeapYear メソッドを使って調べることができます。確認してみたところ、DateTime.IsLeapYear メソッドでは Zend Framework と異なり、以下のように 1582 年は関係ない実装になっているようです。1500年、1700 年のいずれも平年と判断されています。
If DateTime.IsLeapYear(1500) Then ' false End If If DateTime.IsLeapYear(1700) Then ' false End If