閏年をチェックする

指定した年が閏年(うるう年)かどうかを調べる Perl/CGIプログラムを作成 してみましょう。

閏年(うるう年)とは、時間のずれを調整するため、約4年に一度2月の日数を1日増やして29日までとする年のことです。

Perl/CGIプログラムの日付や時間計算の基礎についてはこちらのページを参照 してください。

  1. うるう年の計算方法
  2. うるう年を調べる方法(1)
  3. うるう年を調べる方法(2)

うるう年の計算方法

うるう年は4年に一度というイメージなので、単純に4の倍数で計算したくなりますが…。

実は4の倍数の中でも100の倍数の年はうるう年にはなりません。

また、100の倍数でも400の倍数の年の場合はうるう年となります。

例えば…

1000年はうるう年ではありません。

なぜなら100で割り切れるからです。

これに対して、2000年はうるう年です。

なぜなら、同じように100で割り切れますが、400でも割り切れるからです。

2004年はうるう年です。

なぜなら、100で割り切れなく、4で割り切れるからです。

このようにうるう年の定義というのは少しややこしいので、後述のようにサブルーチン化しておくと便利です。

うるう年を調べる方法(1)

うるう年をチェックする Perl/CGIプログラムを作成 してみましょう。

#!/usr/bin/perl

use strict;

my $thisyear = 1900 + (localtime(time))[5];

print "Content-type: text/html; charset=shift_jis\n\n";

for (my $i=$thisyear-10;$i<=$thisyear+10;$i++) {
if (&LeapYearCheck($i)) {
print $i, "年はうるう年です。<br>\n";
} else {
print $i, "年はうるう年ではありません。<br>\n";
}
}

exit;


sub LeapYearCheck {
my $year = shift;

if (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)) {
return 1;
} else {
return 0;
}
}

__END__

Perl/CGIプログラムサンプル はこちらに設置してあります。

このPerl/CGIプログラムサンプルにアクセスすると、今年を基準としてその前後10年がうるう年であるかどうかを調べて表示します。

Perl/CGIプログラム解説

メイン処理では、まず今年を 変数 「$thisyear」に代入しています。

今年が何年であるかを求めるには、 localtime関数の引数にtime関数から返された値を渡して取得 します。

しかし、localtime関数から返される値というのは 配列 形式になっており、それぞれの要素ごとにあらわしているものが決まっています。

年を表しているのは6番目の要素です。

なので、添え字5を指定し、返された値に1900をたし合わせることにより現在の年を取得することができます。

あとは、 forループ で今年を基準に前後10年の値を変化させながら回していきます。

LeapYearCheck関数

LeapYearCheck関数は、引数に年号を渡すと、その年がうるう年かどうかを調べる サブルーチン です。

うるう年であった場合には1を返し、うるう年でなかった場合には0を返します。

なので、上記Perl/CGIプログラムサンプルのように、戻り値を if文 で判定させると、簡単に指定した年がうるう年であるかどうかがわかります。

うるう年を調べるには、前述のうるう年の定義である「4で割り切れるが100では割り切れない年、もしくは400で割り切れる年」というのをif文にし判定しています。

うるう年を調べる方法(2)

うるう年を調べるPerl/CGIプログラムは、こんなふうに作成することもできます。

#!/usr/bin/perl

use strict;

my $thisyear = 1900 + (localtime(time))[5];

print "Content-type: text/html; charset=shift_jis\n\n";

for (my $i=$thisyear-10;$i<=$thisyear+10;$i++) {
if (&LeapYearCheck($i)) {
print $i, "年はうるう年です。<br>\n";
} else {
print $i, "年はうるう年ではありません。<br>\n";
}
}

exit;


sub LeapYearCheck {
my $year = shift;

return 1 if (($year % 400) == 0);
return 0 if (($year % 100) == 0);
return 1 if (($year % 4) == 0);
return 0;
}

__END__

Perl/CGIプログラムサンプル はこちらに設置してあります。

表示結果は前述のものと同じです。

Perl/CGIプログラム解説

このPerl/CGIプログラムサンプルは、前述のものとほとんど同じです。

メイン処理部分はまったく同じです。

LeapYearCheck関数の引数戻り値ともに同じです。

違うのはLeapYearCheck関数の中身のみです。

見ていただければわかるように、うるう年の判定部分がかなりわかりやすくなっています。

if文が成立すれば、return関数でどんどん抜けていく仕組みです。

まずは、400で割り切れれば無条件でうるう年です。

もし400で割り切れなかった場合は以下の処理をします。

まず、100で割り切れればうるう年ではありません。

それ以外で4で割り切れればうるう年です。

残りはすべてうるう年ではありません。