lisz-works

技術と興味の集合体

Google Apps Scriptで「一定時間経過したか?」判定ロジック

【スポンサーリンク】

Google Apps Script

Google Apps Script……というかjavascriptの時間差分についてです。

ある基準時間から、N時間経過したか?を判定するロジックです。

やりたいこと

ある時間に対して、一定時間経過したか?を判定する処理を作ります。

例えば

「2018/01/01 01:00:00」から、16時間後かどうか判定したい!

というときに使用します。

ロジック

こんな感じ!

var elapsedTime = 16;
var baseDate = new Date(2018, 0, 1, 1, 0);
baseDate.setHours(baseDate.getHours() + elapsedTime);
var base = baseDate.getTime();
var now = Date.now();
console.log(base <= now);  // 経過しているか判定

解説

「elapsedTime」が経過時間です。

判定する日時 = 元にする日時 + 経過時間

となります。

「元にする日時」の取得

今回の例の場合

「2018/01/01 01:00:00」を元にする時刻として設定しています。

new Date(2018, 0, 1, 1, 0);

で、引数で設定した日時のDateオブジェクトを取得する事ができます。

引数は

new Date(年, 月, 日, 時, 分, 秒, ミリ秒)

となります。

必須なのは「年月日まで」なので、以降は設定しなければ「0」として扱われます。

このとき、月は、0始まり、つまり「1月=0」~「12月=11」なので注意してください!

なんでこんな仕様にしたんだろ製作者……

判定用の日時を設定する

元にする日時を設定したあと、「N時間後」を設定します。

baseDate.setHours(baseDate.getHours() + elapsedTime);

の箇所です。

baseDate.setHours();

は、その名の通り、引数の値で「時間」を設定します。

その中でやっている

baseDate.getHours()

もそのとおり、baseDateに設定されている時間を取得しています。

その時間に、elapsedTimeを加算しています。

この時「23時」に「+5」とかしても、勝手に計算して、正しい日時にしてくれます。
Dateオブジェクトのいいところですね。

日時のGet/Set関数

日時それぞれのGet/Set関数はコチラ。

要素 Get Set
getFullYear setFullYear
getMonth setMonth
getDate setDate
getHours setHours
getMinutes setMinutes
getSeconds setSeconds
ミリ秒 getMilliseconds setMilliseconds

現在日時の取得と判定

現在日時の取得は

var now = Date.now();

で行っています。

しかしnow()で取得できるのは、エポックミリ秒です。

エポックミリ秒とは

ある日時を、1970年1月1日午前0時0分0秒(世界標準時)からの秒数で表したもの。UNIX時間(UNIX time, UNIX epoch)とも呼ばれる。
引用:エポック秒とは - はてなキーワード

要するに「2018/08/18 23:43」とかでなく、「1534603430917」とかいう値が取れます。

なのでコレに合わせて比較するために

var base = baseDate.getTime();

とすることで、baseDateをエポックミリ秒化したものを取得する事ができます。

ということは、コレを比較すれば……

console.log(base <= now);  // 経過しているか判定

「対象の日時になったか?」がわかりますね!

ちなみにサンプルソースでは、if文が面倒だったので、結果(True/False)を直接ログ出力しています。

参考

こちらを参考にしました。
ありがとうございました!

Dateオブジェクト (日付と時刻) | JavaScript プログラミング解説

developer.mozilla.org