shikoan’s memo

プログラミング初心者のチラ裏

ぷろぐらみんぐ帳

JavaScriptの日付計算を(少し)楽にする

JavaScriptで日付計算やったら発狂しそうになったんで、多少楽にする方法を考えた。

C#みたいにAddHours()で時間計算する関数を追加してみた(C#の日付計算も結構地雷あってハマるからあんまり両手を上げて褒められないのがアレ)。

Dateの拡張

Date.prototype.addYear = function (yearValue) {
    var result = new Date(this.getTime());
    result.setFullYear(this.getFullYear() + yearValue);
    return result;
}
Date.prototype.addMonth = function (monthValue) {
    var result = new Date(this.getTime());
    result.setMonth(this.getMonth() + monthValue);
    return result;
}
Date.prototype.addDate = function (dateValue) {
    var result = new Date(this.getTime());
    result.setDate(this.getDate() + dateValue);
    return result;
}
Date.prototype.addHours = function (hoursValue) {
    var result = new Date(this.getTime());
    result.setHours(this.getHours() + hoursValue);
    return result;
}
Date.prototype.addMinutes = function (minutesValue) {
    var result = new Date(this.getTime());
    result.setMinutes(this.getMinutes() + minutesValue);
    return result;
}
Date.prototype.addSeconds = function (secondsValue) {
    var result = new Date(this.getTime());
    result.setSeconds(this.getSeconds() + secondsValue);
    return result;
}

Dateのprototypeをこのように拡張してラップ。返り値もDateにしてメソッドチェーンできたほうが使いやすそうなのでそうしてみた(あくまで主観)。

もともとのJavaScriptのではsetHoursのようにもともとの変数の値を変えていくが、拡張したadd○○では新しく変数を作っているため、計算結果が計算前の変数に影響を与えない。以下サンプル。

var now = new Date();
document.writeln(now.toString());//Sat Jul 22 2017 23:05:39 GMT+0900 (東京 (標準時))
document.writeln(now.addYear(-1));//Fri Jul 22 2016 23:05:39 GMT+0900 (東京 (標準時))
document.writeln(now.addMonth(13));//Wed Aug 22 2018 23:05:39 GMT+0900 (東京 (標準時))
document.writeln(now.addDate(-5));//Mon Jul 17 2017 23:05:39 GMT+0900 (東京 (標準時))
document.writeln(now.addYear(1).addMonth(-2).addDate(3));
  //Fri May 25 2018 23:05:39 GMT+0900 (東京 (標準時)) メソッドチェーンもできる

document.writeln(now.addHours(72));//Tue Jul 25 2017 23:05:39 GMT+0900 (東京 (標準時))
document.writeln(now.addHours(0.5));
  //Sat Jul 22 2017 23:05:39 GMT+0900 (東京 (標準時)) 残念ながら小数点以下は反映されない
document.writeln(now.addMinutes(-45));//Sat Jul 22 2017 22:20:39 GMT+0900 (東京 (標準時))
document.writeln(now.addSeconds(114514));//Mon Jul 24 2017 06:54:13 GMT+0900 (東京 (標準時))
document.writeln(now.addHours(114).addMinutes(514).addSeconds(1919));
  //Fri Jul 28 2017 02:11:38 GMT+0900 (東京 (標準時))

引数の小数点以下のaddが無視されるのが少し残念かもしれない。getTime()等でミリ秒単位で計算させれば小数以下も反映されるはず。