週次の日付一覧を取得
とある仕事をしている時に、年間の売上管理システムを依頼された時に、週次売上が確認できるシステムを作って欲しいと頼まれたので、軽く「いいですよ」と返答したけど、内容を確認してみたら、次のような仕様でした。週次の日付rangeを月曜日から日曜日を1つの値として、週ごとの合計値を取得する。確かに、ビジネスにおける売上って曜日の偏りが発生するので、この仕様は特別ではないのですが、2023年10月の場合、次のような並びになります。
2023年10月第1週 : 1日(日) 2023年10月第2週 : 2日(月) ~ 8日(日) 2023年10月第3週 : 9日(日) ~ 15日(日) 2023年10月第4週 : 16日(日) ~ 22日(日) 2023年10月第5週 : 23日(日) ~ 30日(日) 2023年10月第6週 : 31日(日)1ヶ月ってmax31日を7で割って、半端を考えると4週から5週と考えガチですが、この2023年10月は、日曜日が6回もあるのがわかります。 とりあえず、これをJavascriptで算出して、Table表を完成させようとした時に、さてどうやってこのコードを作ればいいかという事ですね。 そして次のようなフローでこれらのデータを算出することが可能だという結論になりました。
これでできた関数がコレです。
- 月末を取得する
- 第一日曜日を取得する
- 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
}
参考ページ : https://www.tech-memo.com/2023/10/javascript-1.html
コードの解説は参考ページを見てください。
1ヶ月のdateを配列で取得
週次が出来上がったら、次は日次です。 でも、これは週次の処理と同じで、月末の日付が取得できたら、簡単にできてしまいます。 とりあえず、配列で1ヶ月分のdate値を取得する関数を作りました。function get_ym2ymd_array(ym){
const arr = []
if(!ym){return arr}
const [y , m] = ym.split("-")
const dt = new Date(`${y}-${m}-01`)
const enf_of_month = new Date(dt.setMonth(dt.getMonth()+1, 0)).getDate()
for(let i=1; i<=enf_of_month; i++){
const d = ("0" + String(i)).slice(-2)
arr.push(`${y}-${m}-${d}`)
}
return arr
}
参考ページ : https://www.tech-memo.com/2023/10/javascript-2023-10-2023-10-01-2023-10-31.html
必要は発明の母
月末の取得が何の問題もなくできるようになったら、一気に2つの便利関数が作れてしまいました。 きっと今後も、webシステムの売上資料を作る時などの際に使い続けると思うので、別のコードアーカイブブログに内容を書き留めておきました。 気持ちよく関数が作れて、仕事も進むかと思っていたんですが、これらの関数ですが、「もっと効率的に書けないものか?」という、思考が頭の隅から離れません。 もはやプログラミング・オタクである事は自分でも認識できますね。
0 件のコメント:
コメントを投稿