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