非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【GAS】日付加算をsetDateメソッドだけでやるとハマったので解決策を書く

   

以前、Google Apps Script(GAS)で日付加算について書きましたが、どうやら紹介した方法だと使い方次第で動作不良を起こすことがわかり書き直すことにしました。

日付加算の基本形(以前紹介した方法)

こちらが紹介した日付加算の方法。30日加算しています。ググるとだいたいこの方法が紹介されているのでけっして間違ったやり方ではありません。

var dt = new Date();
console.log(dt);
dt.setDate(dt.getDate()+30);
console.log(dt);
 

 

実行結果はこちら。とくに問題なく30日足されて表示されました。

 

日付加算を繰り返してみる →問題なし

次に日付加算を繰り返してみましょう。10日加算を5回繰り返してみます。(わかりやすくするためにforループは使いませんでした)

var dt = new Date();
console.log(dt);
dt.setDate(dt.getDate()+10);
console.log(dt);
dt.setDate(dt.getDate()+10);
console.log(dt);
dt.setDate(dt.getDate()+10);
console.log(dt);
dt.setDate(dt.getDate()+10);
console.log(dt);
dt.setDate(dt.getDate()+10);
console.log(dt);
 

 

結果はこちら。期待通り10日ずつ加算されて表示されました。問題はありません。

 

日付加算を繰り返してみる →問題発生

さて、問題はここからです。加算する相手(日付オブジェクト)を別途用意したとします。以下のようにnowオブジェクトを用意しこちらに10日ずつ加算させていきましょう。now自体は変化しないので(getDateメソッドで取得するだけなので)加算値は10ずつ増やしていく必要あります。

var dt = new Date();
var now = new Date();
console.log(dt);
dt.setDate(now.getDate()+10);
console.log(dt);
dt.setDate(now.getDate()+20);
console.log(dt);
dt.setDate(now.getDate()+30);
console.log(dt);
dt.setDate(now.getDate()+40);
console.log(dt);
dt.setDate(now.getDate()+50);
console.log(dt);
 

 

するとご覧の通り。最初は10日ずつ増えていきましたが月を跨いだあたりから変な結果になります。10/2の次が10/12ではなく11/11となり、以降もその変な加算が続きます。

 

解決策

上記の理由はよくわかりません。もしかしてバグなのでしょうか。解決策はsetDateメソッドを使わずnew Dateで初期化しましょう。以下の方法であれば問題は発生しません。

var dt = new Date();
var now = new Date();
console.log(dt);
dt = new Date(now.getFullYear(), now.getMonth(), now.getDate()+10);
console.log(dt);
dt = new Date(now.getFullYear(), now.getMonth(), now.getDate()+20);
console.log(dt);
dt = new Date(now.getFullYear(), now.getMonth(), now.getDate()+30);
console.log(dt);
dt = new Date(now.getFullYear(), now.getMonth(), now.getDate()+40);
console.log(dt);
dt = new Date(now.getFullYear(), now.getMonth(), now.getDate()+50);
console.log(dt);
 

 

結果はご覧のとおりです。付きを跨いでも正常に10日加算されました。

 

スポンサーリンク

 - Google Apps Script