#内容
moment.jsを使い、今月が何週あるのかを求めました。
ついでに、「今日が月の第何週か」も求めます。
参考でピッタリハマるものがなかったので、備忘録として残します。
追記として、puppeteer用いたカレンダーのループ処理を記述予定です。
#対象
・年の第何週かではなく、月の第何週かを出したい方
・moment.jsを使う方
・初心者の方
#目的
やりたかったことは、今月のカレンダーのループ処理を書くことでした。
具体的には、「2021年3月1日〜2021年3月31日の1ヶ月の日毎の会計データを全件取得する」が目的です。つまり、毎日の会計処理データをすべて取得するというものでした。
ループ処理を記述する該当のカレンダーは、Xpathを使用して選択する方法で行いました。
//対象のカレンダー:2021年3月9日のXpath
~/div/table/tbody/tr[2]/td[3]/div
=> ~/div/table/tbody/tr[月の第2週目]/td[日曜始まりの週で3日目]/div を表している
カレンダーの復数のXpathを復数見比べてみるとtr[]
の部分で月の週番号を表しており、td[]
の部分で1週間のうち何日目かを表しているのが分かったので、その2点をfor文で処理を書けば良いと判断出来ます。
###インストール
早速、moment.jsのインストールから使う準備までを行います。
$ npm install moment.js
使用するJavaScript(app.jsなど)のページ内、上部に以下を記載。
const moment = require('moment');
これでmoment.jsを使うことが出来ます!
#やったこと
###必要だったのは情報は3つ
- 今月は第何週あるか
- 月初の週は何日あるか
- 月末の週は何日あるか
月初を求める式を、文章で表すと以下の通りです。
★ 今月は何週あるか = 月末の週番号(年間の第何週) - 月初の週番号(年間の第何週) + 1
moment.jsは月の第何週を求める関数は無いので、年間の週を使って求められます。
2021年3月では、 5週 = 14 - 10 + 1 と表せます。
####1. 今月は第何週あるか
実際に書いていきます!
//今月の月初と月末の日付を求める
var startOfMonth = moment().startOf('month');
var endOfMonth = moment().endOf('month');
//月初と月末の年の週番号を求める
var startOfMonthOfWeekNum = moment(startOfMonth).format('w');
var endOfMonthOfWeekNum = moment(endOfMonth).format('w');
// 今月は何週あるか = 月末の週番号(年間の第何週) - 月初の週番号(年間の第何週) + 1
var targetWeekNum = endOfMonthOfWeekNum - startOfMonthOfWeekNum + 1;
moment.jsには簡単に年始や月初や月末などが簡単に求められるstartOf
, endOf
を使用します。上段で求めた日付を使用し、中段でmoment(対象の日付).format(w)
を使い、年の何週目かを求めます。下段では、文章で表した式にあてはめ、今月が何週あるのかを求められます。 ※変数名は適宜変更してください!
####2 , 3 . 月初・月末は何日あるか
月初・月末は1週間のうち何日あるのかを、曜日番号を使って求めます。
//月初、月末の曜日番号を求める
var dateStartOfMonth = moment(startOfMonth).weekday();
var dateEndOfMonth = moment(endOfMonth).weekday();
moment(対象の月).weekday()
で簡単に曜日番号が求められます。ただ、moment.jsを使った曜日番号は(0〜6)なのでtr[ ]
に入れて繰り返し処理を行う際は、+1をすることで対応します。
###ちなみに今日が月の第何週目か
★ 対象の日付の週番号 = 対象の日付の年週番号 - 対象の日付の初月の年週番号 + 1
2021年3月9日の場合 2 週目 = 11 - 10 + 1
//今日の日付を求める
var today = moment();
//今日が年で何週目かを求める
var todayOfYearOfWeekNum = moment(today).format('w');
//今日が月の何週目かを求める
var todayOfMonthOfWeekNum = todayOfYearOfWeekNum - startOfMonthOfWeekNum + 1;
これで、今日(対象の日付)が何週目かを求めることができました。
#まとめ
今月が何週あるのか。また、月初・月末は曜日番号はバラバラ(毎回7日間あるわけではない)だったので、これをどう解決するかに悩みました。振り返ってみればなんてことないですが、JavaScriptを初めてまだ2週間も経っていなかったのでつまずきました.....
####スクレイピングの分岐記述
ここまでで、目的であったmoment.jsを用いた今月の週番号を取得するができました。
次回はいよいよfor文やif文を用いた条件指定の繰り返し処理を書こうと思いますが、長くなるかつ理解していない部分があるので時間がかかる予定です。あしからず.......
#参考
・Moment.js(公式サイト)
・全61件!Moment.js日付フォーマット実例
・[PHP]対象の日付が月の何週目なのかを調べる
・[Javascript] Moment.jsを使って日付を扱おう
以上