公式ドキュメントなどを漁ったが、ある日付の週の始まりや終わりの日付などは取得できても、シンプルに「2022/5/22は5月の第何週か?」を求められるメソッドがなさそうなので自前で実装。
結論
以下の式でできる。
const week = (dayjsObject.date() + dayjsObject.startOf("month").day() + 6) / 7
一応式の解説
Day.jsは以下のday
メソッドで曜日を求めることができ、対応表は下記の通り
曜日 | 値 |
---|---|
日 | 0 |
月 | 1 |
火 | 2 |
水 | 3 |
木 | 4 |
金 | 5 |
土 | 6 |
その月の1日が日曜の場合
例えばこういう時
週 | 日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|---|
第1週 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
第2週 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
これは簡単で7で割った商に1を足せば求められる
<(日付-1)/7 の商> + 1
# 7日なら (7-1)/7 + 1 = 0 + 1 = 1
# 9日なら (9-1)/7 + 1 = 1 + 1 = 2
その月の1日が日曜以外の場合
例えば火曜始まりだとこういう時
週 | 日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|---|
第1週 | 1 | 2 | 3 | 4 | 5 | ||
第2週 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
これはこの月の1日の曜日day()
の値を足してあげれば日曜始まりと同じように計算できる。
この例だと1日は火曜(day()=2
)なので、2
を全ての月に足せば1日始まりと同じになる
週 | 日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|---|
第1週 | +2 | +2 | 1+2 | 2+2 | 3+2 | 4+2 | 5+2 |
第2週 | 6+2 | 7+2 | 8+2 | 9+2 | 10+2 | 11+2 | 12+2 |
結果これと一緒 ↓
週 | 日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|---|
第1週 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
第2週 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
つまり(その月の1日のdayの値)
を足せば日曜始まりと同じように計算できる
<(日付-1+(その月の1日のdayの値))/7 の商> + 1
よって、全ての月でこれで計算可能
(dayjsObject.date() - 1 + dayjsObject.startOf("month").day()) / 7 + 1
↓
(dayjsObject.date() + dayjsObject.startOf("month").day() + 6) / 7
感想
探したけど意外となかったので自前で実装しましたが、実は普通にday.jsの機能でありそう。
もしくはもっと簡単に求められるかもしれません。