その年がうるう年かどうかを判定する式
プログラマでは割と当たり前なのかな? 私は学生のとき、プログラムの勉強をしたときに習った。
うるう年は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月の日数を求めることができる。まさに一石二鳥!