【GAS】相対日付の取得方法(明日・昨日・1週間後・1か月後・1年後)

GASDate,formatDate

GASで、1日後(n日後) / 1週間後(n週間後) / 1か月後(nか月後) / 1年後(n年後)といった、ある基準日付からの相対的な日付の取得方法、Date型データの比較についてご紹介します。

前提:GASに日付の演算メソッドは用意されていない

GASのDataクラスには演算するためのメソッド等は用意されていません。

普通の演算記号でData型の変数同士を演算するとミリ秒が戻ります。例えば2022年8月23日と2022年8月22日を引き算すると、86,400,000ミリ秒(=1日)が結果となります。

  let day_1 = new Date('2022/08/23');
  console.log(day_1);//Tue Aug 23 2022 00:00:00 GMT+0900 (Japan Standard Time)

  let day_2 = new Date('2022/08/22');
  console.log(day_2); //Mon Aug 22 2022 00:00:00 GMT+0900 (Japan Standard Time)
  
  console.log(day_1 - day_2); //86400000

特定日時単位の数値を抽出・演算して相対日付を算出する

日時の演算では相対的な日時を出したり期間を算出したい場合が多いためミリ秒ではいろいろ不都合ですね。ミリ秒を都度変換しても良いですが、対象としたい単位を抽出して計算するのが一般的です。

例えば、2022年8月23日と2022年8月22日の日付を抽出して引き算をすると、日付単位の差分である「1」という結果になります。

  let day_1 = new Date('2022/08/23');
  let day_2 = new Date('2022/08/22');

  console.log(day_1.getDate() - day_2.getDate()); //1

この演算方法を利用することで相対日付を算出します。

GASにおける相対日付の取得方法

「明日(1日後)」を算出するサンプルコードは下記です。2022年8月22日を基準日として1日後を算出しています。

  let today = new Date('2022/08/22');

  let tomorrow = new Date(today);
      tomorrow.setDate(today.getDate()+1);

  console.log(Utilities.formatDate(tomorrow, 'Asia/Tokyo', 'yyyy/MM/dd')); //2022/08/23
相対日付の取得時には変数を再定義(宣言)する

GASのDateクラスの計算で注意しなければならないのが、計算時に元のDate型変数を代入してはいけないということです。代入すると参照元が同じとなり元の変数の日時も変わってしまいます。

  let today = new Date('2022/08/22');
  console.log(Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd')); //2022/08/22

  let tomorrow = today;
      tomorrow.setDate(today.getDate()+1);

  console.log(Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd')); //	2022/08/23
  console.log(Utilities.formatDate(tomorrow, 'Asia/Tokyo', 'yyyy/MM/dd')); //	2022/08/23

新しいDate型の変数を取得するには、元の変数を用いて再定義(宣言)するようにしてください。

  let today = new Date('2022/08/22');
  console.log(Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd')); //2022/08/22


  let tomorrow = new Date(today);
      tomorrow.setDate(today.getDate()+1);

  console.log(Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy/MM/dd')); //2022/08/22
  console.log(Utilities.formatDate(tomorrow, 'Asia/Tokyo', 'yyyy/MM/dd')); //2022/08/23

いろいろな相対日付・時刻の取得方法

「2022/08/22 21:00 ・ Mon Aug 22 2022 21:00:00 GMT+0900 (Japan Standard Time)」を基準としていろいろな日付の取得方法をご紹介します。

  let d = new Date('2022/08/22 21:00');
  console.log(Utilities.formatDate(d, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //2022/08/22 21:00

明日・1日後(n日後)

  let d_d1 = new Date(d);
      d_d1.setDate(d.getDate() + 1);
  console.log(Utilities.formatDate(d_d1, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //2022/08/23 21:00

  let d_d2 = new Date(d);
      d_d2.setDate(d.getDate() + 2);
  console.log(Utilities.formatDate(d_d2, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //2022/08/24 21:00

  // ・・・・

  let d_d10 = new Date(d);
      d_d10.setDate(d.getDate() + 10);
  console.log(Utilities.formatDate(d_d10, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //2022/09/01 21:00

来月・1か月後(nか月後)

  let d_m1 = new Date(d);
      d_m1.setMonth(d.getMonth() + 1);
  console.log(Utilities.formatDate(d_m1, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //	2022/09/22 21:00

  let d_m2 = new Date(d);
      d_m2.setMonth(d.getMonth() + 2);
  console.log(Utilities.formatDate(d_m2, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //	2022/10/22 21:00

  // ・・・・

  let d_m10 = new Date(d);
      d_m10.setMonth(d.getMonth() + 10);
  console.log(Utilities.formatDate(d_m10, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //	2023/06/22 21:00

来年・1年後(n年後)

  let d_y1 = new Date(d);
      d_y1.setFullYear(d.getFullYear() + 1);
  console.log(Utilities.formatDate(d_y1, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //	2023/08/22 21:00

  let d_y2 = new Date(d);
      d_y2.setFullYear(d.getFullYear() + 2);
  console.log(Utilities.formatDate(d_y2, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //		2024/08/22 21:00

  // ・・・・

  let d_y10 = new Date(d);
      d_y10.setFullYear(d.getFullYear() + 10);
  console.log(Utilities.formatDate(d_y10, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm')); //	2032/08/22 21:00

まとめ

GASにおけるいろいろな日付の取得方法をご紹介しました。

この記事を書いた人

てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点