JavaScriptで翌月を取得するときの注意点

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
 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

コメントが承認されるまで時間がかかります。

2021年4月
 123
45678910
11121314151617
18192021222324
252627282930