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ブーム?の影響で、グローバル領域だとか、組み込みオブジェクトへのお作法が厳しいので、このまま使えるかどうかは状況次第ですが、覚えておいて損はなさそうです。
以上です。
タグ: JavaScript

