【ツールの概要】
・['YYYY/MM', 'YYYY/MM', ...]な感じで月単位の配列を作る。
・moment.jsを活用する。
・今回は自分の都合上、3年前の最初(1月)から当月までの年月文字列配列を作ります。
【環境(使っている環境)】
・moment.js(2.29.1)
【ソース(関数部分)】
let arr = []; let i = 0; let start = moment().add(-3, 'years').startOf('year'); // addせず、moment(なにか)で開始日を指定するのもいいですね let end = moment().startOf('month'); // 今月までなのでmoment()です let diffmonthes = end.diff(start, 'months'); // 201801-202105なら40がとれます for(; i <= diffmonthes; i++) { arr.push(start.clone().add(i, 'months').startOf('month').format('YYYY/MM')); } console.log(arr);
【説明】
・moment.jsを読み込んだ状態で実行します。
・momentオブジェクト?(Dateオブジェクトをラッパした感じのもの)はかなり多機能で、javascriptで日付を扱うならmoment.jsをぜひ利用したいもの。
・4、5行目で3年前の1月月初と当月月初のmomentオブジェクトを取得します。
startとendについて、いずれも月初(startOf)としています。
その理由は差分を取る時に同じ日付としてないと差分月数が正確に取れなさそうなためです。
6行目でdiff( , 'month')で差分の月数を取ります。(2021/4/1~2021/5/1なら1になります。日付がずれてて且つ引数3つ目にtrueを指定すると小数までdiffがでます)
Month and year diffs
moment#diff has some special handling for month and year diffs. It is optimized to ensure that two months with the same date are always a whole number apart.
~~
出典:Moment.js Documentation
・あとはfor文で一月ずつcloneしてformatで指定した形式の文字列を配列にaddします。
add(0, 'month')で当月いけるっぽいです
ここのstartOfは不要だと思いますがなんとなく。。
clone()はmoment()でもよさげですね
iをあくまでイテレータとして1ずつstartそのものを加算しても良いですね
【総評】
意外と記事がなかったのでまとめました。
標準のDateオブジェクトだとなかなか遠回りになりそうなので、moment.jsの便利さが際立ちます。