[Javascript] 1ヶ月の中の指定の曜日を基準に週ごとの配列データを作成する

ソースコード

function weekly_lists(y, m){ // 月の日付フォーマットを整形(ゼロパディング) m = ("0"+m).slice(-2) // 月の1日の曜日を取得(週) const dt = new Date(`${y}-${m}-01`) const firstDayWeek = dt.getDay() // 第1日曜日を取得(日) const nextSunday = firstDayWeek ? 1 + 7 - firstDayWeek : 1; // 月の最終日を取得 const endOfMonth = new Date(dt.setMonth(dt.getMonth()+1, 0)).getDate() const arr = [{ y : y, m : m, from : 1, to : nextSunday, }] for(let i=nextSunday+1; i<=endOfMonth; i=i+7){ arr.push({ y : y, m : m, from : i, to : i + 6 < endOfMonth ? i + 6 : endOfMonth, }) } return arr }

使い方

weekly_lists(y,m) 関数に対して、年と月の値を送るだけで、次のフォーマットで週ごとの情報が返ってきます。
[ { y : 指定された年, m : 指定された月, from : 1,(月の開始日) to : ※月末の日付 }, ... ]

解説

今回のプログラムは、月曜日から日曜日を基準にして、週ごとのデータを配列で取得できるようになっています。 とある、集計レポートで週次処理があったために作ったコードです。

1. 最初の日曜日を取得

これは1日〜最初の日曜日が、配列の1番目になるので、これを手動で取得します。

2. 月の最終日を取得

対象月の月末情報は、先日書いたブログでも解説しています。 [Javascript] ◯年◯月から◯年◯月◯日一覧を取得する関数(対象の年月から、年月日一覧を作成) const enf_of_month = new Date(dt.setMonth(dt.getMonth()+1, 0)).getDate() 上記のコードで最終日が取得できます。

3. 反復処理の+7で値を取得していく

for(let i=nextSunday+1; i<=endOfMonth; i=i+7){ arr.push({ y : y, m : m, from : i, to : i + 6 < endOfMonth ? i + 6 : endOfMonth, }) } 最終週のみ、日付がオーバーしないように処理を加えています。

デモ

今月の日曜日を基準にした、週ごとのデータ。