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