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)を直接ログ出力しています。
参考
こちらを参考にしました。
ありがとうございました!