JavaScriptで月末の日を求める

Pocket

下に示すようなJavaScriptのコードを見ました。
年と月を与えて月末の日を求める関数です。

function last_day(nen, tsuki) {
  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には年月日の計算を行う仕組みが組み込まれています。閏年の処理も反映されるので、それを活用すると次のように書けます。

function last_day(nen, tsuki) {
  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行で書けますが、他人が読んで「当月月末を示す」とすぐに理解できるか疑問ですので、上のように定義に従って一つずつ書くのも大事かもしれません。

[ 2014年5月10日 | カテゴリー: JavaScript | タグ: ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報