プレミアムフライデーで学ぶJavaScript🍤

プレミアムフライデーを求める関数は以下のようになります。

function premium(year, month) {
  const d = new Date(year, month, 0);
  const w = d.getDay();
  return new Date(year, month, -(w + 2) % 7);
}

実行。

console.log(premium(2018, 12)); // 2018-12-28T00:00:00.000Z
console.log(premium(2019, 1)); // 2019-01-25T00:00:00.000Z

2018年12月のプレミアムフライデーは28日、2019年1月のプレミアムフライデーは25日。うまく動いています。

もうすこし詳しく

Date の構文はつぎのようになります。

new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

year は年を表す整数値。

monthIndex は月を表す整数値。ただし、1月は 0、12月が 11、というように月のインデックスであることには注意が必要です。

day は1ヶ月の日を表す整数値。ただし、0 以下が指定されると前の月の最終日から day 日前のDateインスタンスを返します。

これらをふまえて premium 関数を1行ずつみてみます。

1行目

function premium(year, month)

対象となる年と月を取得。

2行目

const d = new Date(year, month, 0);

対象月の最終日の Date インスタンスを取得。

3行目

const w = d.getDay();

対象月の最終日の曜日(0 ~ 6)を取得。

4行目

return new Date(year, month, -(w + 2) % 7);

最終日から -(w + 2) % 7 日前のDate インスタンスを返す。

プレミアムフライデーを求める関数のイメージ図

余談

プレミアムフライデーかどうかを判別する機会があり、そのときに上記のプレミアムフライデーを求める関数を知りました。ぱっとみただけでは動きがわからなかったため、本記事で詳しい動きを追ってみました。

ついでに、プレミアムフライデーを扱うためのライブラリをnpmに公開しました。

参考