JavaScriptのDateオブジェクトを拡張して年月日の加減算を実装してみる

2015 年 11 月 9 日 by 山平

JavaScriptのDateが不親切なのは周知の事実だと思いますが、以下のようなサイトを見つけました。

この記事によれば、setDate、setMonth、setYearに数字を入れれば良いだけ、ということになります。
じゃあ1日-1は0日とか、31日+1日は32日と言う指定の場合はどうなるのか、試してみました。

var date = new Date(2015, 12-1, 31);
var func = function(d){
return [ d.getFullYear(), d.getMonth()+1, d.getDate() ].join('/');
};
//date
date.setDate(date.getDate() + 1);
console.log(func(date));//=>2016/1/1
date.setDate(date.getDate() - 1);
console.log(func(date));//=>2015/12/31
//month
date.setMonth(date.getMonth() + 1);
console.log(func(date));//=>2016/1/31
date.setMonth(date.getMonth() - 1);
console.log(func(date));//=>2015/12/31
//year
date.setYear(date.getFullYear() + 1);
console.log(func(date));//=>2016/12/31
date.setYear(date.getFullYear() - 1);
console.log(func(date));//=>2015/12/31

うーん、ちゃんと動く。
これならdateAdd関数とかも作れてしまいそうですね。

試しに作ってみました。

Date.prototype.dateAdd = function dateAdd(days){ this.setDate(date.getDate() + days); };
Date.prototype.monthAdd = function monthAdd(months){ this.setMonth(date.getMonth() + months); };
Date.prototype.yearAdd = function yearAdd(years){ this.setYear(date.getFullYear() + years); };

var date = new Date(2015, 12 - 1, 31);
var func = function(d){
return [ d.getFullYear(), d.getMonth()+1, d.getDate() ].join('/');
};
//date
date.dateAdd(1);
console.log(func(date));//=>2016/1/1
date.dateAdd(-1);
console.log(func(date));//=>2015/12/31
//month
date.monthAdd(1);
console.log(func(date));//=>2016/1/31
date.monthAdd(-1);
console.log(func(date));//=>2015/12/31
//year
date.yearAdd(1);
console.log(func(date));//=>2016/12/31
date.yearAdd(-1);
console.log(func(date));//=>2015/12/31

こちらも期待通り。

最近のJavaScriptブーム?の影響で、グローバル領域だとか、組み込みオブジェクトへのお作法が厳しいので、このまま使えるかどうかは状況次第ですが、覚えておいて損はなさそうです。

以上です。

タグ:

TrackBack