[ PHP ] 閏(うるう)年の判定を行う3通りの実装方法

Pocket

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
参考
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>