下に示すようなJavaScriptのコードを見ました。
年と月を与えて月末の日を求める関数です。
var days, feb_leap, lastday;
days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
feb_leap = 29;
if (tsuki == 2){
if((nen % 4 == 0 && nen % 100 != 0) || nen % 400 == 0) {
lastday = feb_leap;
} else {
lastday = days[tsuki - 1];
}
} else {
lastday = days[tsuki - 1];
}
return lastday;
}
まず1月から12月までのそれぞれの日数(月末の日)を配列で指定しています。
そして閏年の2月の日数(29日)を指定しています。
次に2月の場合を考えます。
年が4で割り切れる場合は閏年ですが、100で割り切れる場合は閏年ではありません。さらに400で割り切れる場合は閏年になります。
「4で割り切れて100で割り切れない」または「400で割り切れる」ときは閏年なので「29日」になります。
それ以外は通常の月と同じ処理です。
配列の添え字は0から始まります。1月は「0」、2月は「1」となるので、添え字を月から1を減じた数にすればその月の日数が求まります。
これはこれでいいのですが、非常に面倒です。
元々、JavaScriptには年月日の計算を行う仕組みが組み込まれています。閏年の処理も反映されるので、それを活用すると次のように書けます。
return (new Date(nen, tsuki, 0)).getDate();
}
年、月、日を指定して日付オブジェクトを生成します。月は配列と同じで1月が「0」であることに注意します。
指定する年月の「翌月1日の前日」を指定すれば「当月月末の翌日」になります。「翌月1日の前日」すなわち「翌月0日」を指定すれば「当月月末」になります。
「当月1日」は「Date(nen, tsuki – 1, 1)」となります。
「翌月1日」は「Date(nen, tsuki – 1 + 1, 1)」となります。
「翌月0日」は「Date(nen, tsuki – 1 + 1, 0)」すなわち「Date(nen, tsuki, 0)」となります。
これだと実質1行で書けますが、他人が読んで「当月月末を示す」とすぐに理解できるか疑問ですので、上のように定義に従って一つずつ書くのも大事かもしれません。
コメント