JavaScriptで翌月を取得しようとしたときに、挙動で少し迷ったので対応方法をメモ。
サンプルコード
例として、2018年2月28日と2018年1月31日の翌月を取得してみます。
翌月の設定はgetMonth()で現在の月を取得して、1を足した値をsetMonth()で設定できます。
JavaScript
// 例1 2018年2月28日 var date1 = new Date(2018, (2- 1), 28); // 1ヶ月後の設定 date1.setMonth(date1.getMonth() + 1); console.log(date1); // Wed Mar 28 2018 00:00:00 GMT+0900 // 例2 2018年1月31日 var date2 = new Date(2018, (1- 1), 31); // 1ヶ月後の設定 date2.setMonth(date2.getMonth() + 1); console.log(date2); // Sat Mar 03 2018 00:00:00 GMT+0900
結果は2018年2月28日が2018年3月28日、2018年1月31日が2018年3月3日となりました。
翌月を取得するデモページ1
2018年1月31日が2018年3月3日となるのは、本来翌月になる2018年2月が28日までしかないため、オーバーしている3日をプラスしてさらに翌月にずれ込んでいるためです。
今回はさらに翌月にずらすのではなく末日で止めたかったので、翌月で止める関数を作って対応しました。
JavaScript
// 例1 2018年2月28日 var date1 = new Date(2018, (2- 1), 28); // 1ヶ月後の設定 var nextmonth1 = get_nextmonth_date(date1); console.log(nextmonth1); // Wed Mar 28 2018 00:00:00 GMT+0900 // 例2 2018年1月31日 var date2 = new Date(2018, (1- 1), 31); // 1ヶ月後の設定 var nextmonth2 = get_nextmonth_date(date2); console.log(nextmonth2); // Wed Feb 28 2018 00:00:00 GMT+0900 /** * 指定した日付からXヶ月後のDateオブジェクトを取得する * @param {object} date - 基準のDateオブジェクト * @param {number} months - 何ヶ月先の日付を取得するか */ function get_nextmonth_date(date, months) { // monthsの指定がない場合は翌月を取得 var months = months || 1; // 基準の年月日を取得 var year = date.getFullYear(); var month = date.getMonth(); var day = date.getDate(); // 基準の年月からDateオブジェクトを生成 var nextDate = new Date(year, month); // 月の設定を変更 nextDate.setMonth(nextDate.getMonth() + months); // 末日を取得 var lastDay = new Date(nextDate.getFullYear(), nextDate.getMonth() + 1, 0).getDate(); // 元の日にちが該当月に無い場合はその月の末日を設定する if(lastDay < day) { nextDate.setDate(lastDay); } else { nextDate.setDate(day); } return nextDate; }
今回は翌月を取得したかっただけなので特に使っていませんが、引数で翌月以外も指定できるようにしています。
翌月を取得するデモページ2
【参考サイト】
コメントが承認されるまで時間がかかります。