[Javascript] Date処理でその月の最終日が取得したらできる処理についての話

2023年11月13日

Javascript 日記

eyecatch 今どきのプログラマーは車輪の再発明をしないのがセオリーと言われていますが、めちゃくちゃ今でも自分で関数を作りまくっている、フリー・プログラム・クリエーターのユゲタです。 JavascriptのDate関数ってなれないとなかなか扱いが難しい基礎関数の一つです。

週次の日付一覧を取得

とある仕事をしている時に、年間の売上管理システムを依頼された時に、週次売上が確認できるシステムを作って欲しいと頼まれたので、軽く「いいですよ」と返答したけど、内容を確認してみたら、次のような仕様でした。
週次の日付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. 月末を取得する
  2. 第一日曜日を取得する
  3. 1週目を算出
  4. 中間週を算出
  5. 最終週を算出
これでできた関数がコレです。 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システムの売上資料を作る時などの際に使い続けると思うので、別のコードアーカイブブログに内容を書き留めておきました。 気持ちよく関数が作れて、仕事も進むかと思っていたんですが、これらの関数ですが、
「もっと効率的に書けないものか?」
という、思考が頭の隅から離れません。 もはやプログラミング・オタクである事は自分でも認識できますね。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ