その年がうるう年かどうかを判定する式

カテゴリ: コンピュータ / 公開日: 2010年6月02日(水曜)02:25 / 投稿者: Tom Goodsun

プログラマでは割と当たり前なのかな? 私は学生のとき、プログラムの勉強をしたときに習った。

うるう年は4年一度という周期で訪れる。これをアルゴリズムで分析すると、こんな簡単な式になってしまう。
 

うるう年を判定する条件は以下の通り。

  • その年数を400で割ったときのあまりが0または4で割ったときのあまりが0、かつ100でわったあまりが0でないものはうるう年である。

この法則を元にうるう年を判定するプログラムを作ってみる。たとえばPHPの関数なら以下の通り。

function is_leap($year) {
    return $year % 400 == 0 || $year % 4 == 0 && $year % 100 != 0;
}

でもPHPには実はうるう年かどうかを判定する仕組みが用意されている。

$timestamp = strtotime('2010-06-02 00:00:00');
$is_leap = date('L', $timestamp); // うるう年なら1、それ以外は0

date()関数の第1引数に「L」を指定するとうるう年の場合は1、それ以外は0が返ってくる。

なぜ真偽値でないか。真偽値でないほうが使い安かったりする。

/**
 * うるう年を判定する
 * @param $year
 * @return Integer 0 or 1
 */
function is_leap($year) {
    // date()関数を使う場合
    $timestamp = strtotime($year . '-01-01 00:00:00');
    return date('L', $timestamp);

    // 式を使う場合
    return ($year % 400 == 0 || $year % 4 == 0 && $year % 100 != 0) ? 1 : 0;
}

/**
 * 月の日数を求める
 * @param $year
 * @param $month
 * @return Integer
 */
function get_day_of_month($year, $month) {
    switch ($month) {
        case  1:
        case  3:
        case  5:
        case  7:
        case  8:
        case 10:
        case 12:
            return 31;
            break;
        case  4:
        case  6:
        case  9:
        case 11:
            return 30;
            break;
        case 2:
            return 28 + is_leap($year);
            break;
        default:
            return null;
            break;
    }
}

0か1を返すことで、2月のときのみ28に返り値を足し算することで、うるう年の場合の2月の日数を求めることができる。まさに一石二鳥!