#やりたいこと
datepicker等で選択した日付の範囲を、月単位、日単位で区切り配列にぶち込む。
'2020-08-17' から '2020-09-03' で期間指定したとき、
日単位の場合は素直に
['2020-08-17','2020-08-18','2020-08-19',...,'2020-09-03']
月単位の場合は、'yyyy-mm' 部分をみて
['2020-08','2020-09']
が欲しい。
#本題
今回は、期間は決め打ちで。
配列を用意して
var fromDate = '2020-08-17'
var toDate = '2020-09-03'
var monthlyRange = [];
var daylyRange = [];
for文で日、月を加算していくので、date型に変換
new Date('yyyy-mm-dd')
の形でOK。
参考:http://cly7796.net/wp/javascript/how-to-use-new-date/
new Date('yyyy-mm')
だとddの部分は '01' になる。月の加算、配列格納はこちらを利用。
// 指定した日付から年と月を取り出す。'yyyy-mm-dd' => 'yyyy-mm'
regexp = new RegExp(/\d\d\d\d-\d\d/);
var fromYM = fromDate.match(regexp)[0];
var toYM = toDate.match(regexp)[0];
// 日付の大小比較のため、date型に変換
var start = new Date(fromDate);
var end = new Date(toDate);
// ddを省略することで、その年月の一日のdateが手に入る
var startYM = new Date(fromYM);
var endYM = new Date(toYM);
後は以下。
型変換は下で定義した関数で行う。
// date型を文字列に変換し配列に格納
for(var ym = startYM; ym <= endYM; ym.setMonth(ym.getMonth()+1)) {
var strYearMonth = convertToStr(ym, 0);
monthlyRange.push(strYearMonth);
}
for(var d = start; d <= end; d.setDate(d.getDate()+1)) {
var strDate = convertToStr(d, 1);
daylyRange.push(strDate);
}
// date型を文字列に変換する
function convertToStr(date, day){
// dayはフラグ。真のとき'yy-mm-dd'、偽のとき'yy-mm'。
var strDate;
if(day){
strDate = [
date.getFullYear(),
('0' + (date.getMonth() + 1)).slice(-2),
('0' + date.getDate()).slice(-2)
].join('-');
}else{
strDate = [
date.getFullYear(),
('0' + (date.getMonth() + 1)).slice(-2),
].join('-');
}
return strDate;
}
結果
["2020-08", "2020-09"]
["2020-08-17", "2020-08-18", "2020-08-19", "2020-08-20", "2020-08-21", "2020-08-22", "2020-08-23", "2020-08-24", "2020-08-25", "2020-08-26", "2020-08-27", "2020-08-28", "2020-08-29", "2020-08-30", "2020-08-31", "2020-09-01", "2020-09-02", "2020-09-03"]
最適解ではないと思いますが、とりあえず思い通りです。