立入|ITブログ
【GAS】日付・時間の処理まとめ! UNIX時間・formatDate・Dateオブジェクトを理解しよう

 

GASで時間を扱うには?

プログラムで時間の情報を扱うには少し慣れが必要です。今回はGASで時間情報を扱うための方法を紹介します。

前準備:タイムゾーンを東京に設定する

まず気を付けなければならないのは時差です。

GASはGoogleが開発したものなので、デフォルトでは時間がアメリカのものになっています。これを日本に変更しないと時差が発生してしまいます。

そのため日本でプログラムを動かすなら、下記の手順でタイムゾーンを東京に変更する必要があります。

  1. Google Apps Scriptのプロジェクトを開く
  2. プロジェクト設定(歯車マーク)を開く
  3. 「全般設定」の**「appsscript.json」マニフェスト ファイルをエディタで表示する**をチェックする
  4. エディタ(<>マーク)を開く
  5. appsscript.jsonを開く
  6. "timeZone": "America/New_York””America/New_York””Asia/Tokyo”に変更する

基本知識:GASでの時間の扱い方

GASの時間は「Dateオブジェクト」と「UNIX時間」と「formatDate」で表現される

GAS(Javascript)において、時間はDateオブジェクトUNIX時間formatDateで表現されます。

Dateオブジェクトは年月日や曜日等の時間の情報をそのまま持っています。

これに対し、UNIX時間は「1970年1月1日0時0分0秒」から今までに経過した時間をミリ秒で表現したものです。1秒=1000ミリ秒なので、「1970年1月1日0時0分1秒」のUNIX時間は1000になります。

そして時間は「1970年1月1日」や「1970/1/1」、「0:00:00」等様々なフォーマットで表現されます。こうしたフォーマットへの変換を行えるのがformatDateです。

Dateオブジェクト Thu Jan 01 1970 09:00:01 GMT+0900 (Japan Standard Time)
UNIX時間 1000
formatDate 1970年1月1日、1970/1/1、00:00:00 etc…

変換は下記のように可能です。DateオブジェクトであればUNIX時間への変換もできますし、formatDateも使えます。

Dateオブジェクト UNIX時間、formatDate
UNIX時間 Dateオブジェクト
formatDate

Dateオブジェクトを計算するとUNIX時間になる

Dateオブジェクトは年月、日時、分、秒、曜日等、時間に関するあらゆる情報を含んでいます。たくさんの情報を持っているので、時間を扱うにはとても便利です。

それにも関わらずなぜUNIX時間があるのかというと、計算を行うためです。

例えばDateオブジェクトに1を足そうとしても、1年なのか1日なのかを判別できません。しかし時間をUNIX時間で表してから1000を足せば、これは1秒後だと分かります。

ですから時間を扱う時には、基本はDateオブジェクトを使います。その上で時間の計算を行うと、データがUNIX時間になると思って下さい。

現在の時間を取得する

DateオブジェクトとUnix時間の両方とも、現在の時間を取得する事ができます。

var Dateオブジェクト = new Date()
var Unix時間 = Date.now()

UNIX時間⇔Dateオブジェクトの変換を行う

DateオブジェクトとUnix時間は相互に変換を行えます。

var Dateオブジェクト = new Date()
var Unix時間 = Date.now()

var DateオブジェクトからUNIX時間へ = Dateオブジェクト.getTime()
var UNIX時間からDateオブジェクトへ = new Date(UNIX時間)

1. Dateオブジェクト

ここからは各形式での処理を解説していきます。まずは術tネオ基本になるDateオブジェクトです。

Dateオブジェクトの年・月・日・時・分・秒・ミリ秒を取得する

現在が「何年・何月・何日…」等を取得するにはget○○を使用します。

年・日・時・分・秒・ミリ秒はそのまま今の時間を取得できます。

月については、カウントが0から始まるので、1月は0、12月は11になります。

曜日については日曜が0、土曜が6です。例に出している2022年12月31日は金曜なので、数値は5になります。

//現在時刻が2022/12/31/23:59:59 123 とする

var Dateオブジェクト = new Date()

var 年 = Dateオブジェクト.getFullYear() //2022
var 月 = Dateオブジェクト.getMonth()    //11
var 日 = Dateオブジェクト.getDate()     //31
var 時 = Dateオブジェクト.getHours()    //23
var 分 = Dateオブジェクト.getMinutes()  //59
var 秒 = Dateオブジェクト.getSeconds()  //59
var 曜日 =  Dateオブジェクト.getDay()    //5
var ミリ秒 = Dateオブジェクト.getMilliSeconds() //123

曜日を取得する

getDay()は曜日の番号を返してくれます。日曜が0、月曜が1…という感じです。金曜は5なので、配列の6番目に「金曜日」と入れておけば、「金曜日」という文字列を取得できます。

//曜日 = 金、何曜日 = 金曜
var 曜日  = ["日","月","火","水","木","金","土"][new Date().getDay()]
var 何曜日 = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"][new Date().getDay()]

任意の時間のDateオブジェクトを取得する

現在の時間ではなく、指定した時間を取得したい場合は引数を指定します。

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

引数は後ろのものを省略する事ができます。省略した部分は1月・1日・0時・0分・0秒・0ミリ秒になります。

ただし月は0から数え始めるので、例えば「11」を入れると「12月」になります。また「12」を入れると「来年の1月」を、「13」を入れると「来年の2月」を出してくれます。

//2022/12/31 23:59:00 0123
var Dateオブジェクト = new Date(2022,11,31,23,59,00,123)

//2022/12/31 00:00:00 000
var Dateオブジェクト = new Date(2022,11,31)

2. UNIX時間

ここまではDateオブジェクトの扱い方を説明しました。次はUNIX時間の取り扱いを見ていきましょう。

基本知識:時間情報の変更や計算を行う時の基本的な流れ

Dateオブジェクトを変更する時には、計算を行う事になります。計算を行う時、DateオブジェクトがUNIX時間になる事は最初に説明しました。そしてUNIX時間のままでは年や月、曜日の情報が分からないので、UNIX時間はDateオブジェクトに戻した方が便利です。

そのため基本的な流れは下記になります。

  1. Dateオブジェクトを作成する
  2. 計算する。計算結果はUNIX時間になっている
  3. UNIX時間をDateオブジェクトに変換する

Dateオブジェクトの情報を変更する時の注意点

Dateオブジェクトの情報を変更する時にはいくつかの注意点があります。

「12月31日」の月を2月にすると「3月3日」になってしまう

「2022年12月31日」の月を2月に変更すると「2022年2月31日」となります。(閏年でなければ)2月は28日までしかないので、余った3日分は繰り上がり、結果は「2022年3月3日」になります。4月や6月等、30日までしかない場合も同様です。

そのため2月を指定したはずなのに、結果は3月になってしまうという事が起こります。

「2020年2月29日」の年を2021年にすると「2021年3月1日」になってしまう

2021年は閏年ではないので、2月29日が存在しません。そのため「2021年2月29日」を指定すると、余った一日が加算されて「2021年3月1日」になってしまいます。

年・月の変更を行う場合、日付は1日だと確実

上記の問題は、いずれも日付が月末に指定されている事が原因で起こります。特に必要がなければ、日付は1日にしておく事で不要なトラブルを防げるでしょう。

年・月・日・時・秒・ミリ秒を指定した時間に変更する

まずはDateオブジェクトの時間情報を変更する方法です。set〇〇で年、月、日等の情報を変更する事ができます。

Dateオブジェクト.setMonth(0)であれば、Dateオブジェクトの月が1月になるように計算を行ってくれます。計算の結果はUNIX時間なので、Dateオブジェクトへの変換を行いましょう。

//2022/12/31 23:59:59 123
var Dateオブジェクト = new Date(2022,11,31,23,59,59,123)

var UNIX時間_2023年 = Dateオブジェクト.setYear(2023)  //1704034740123
var UNIX時間_1月 = Dateオブジェクト.setMonth(0)  //1675177140123
var UNIX時間_1日 = Dateオブジェクト.setDate(1)  //1672585140123
var UNIX時間_0時 = Dateオブジェクト.setHours(0)  //1672502340123
var UNIX時間_0分 = Dateオブジェクト.setMinutes(0)  //1672498800123
var UNIX時間_0秒 = Dateオブジェクト.setSeconds(0)  //1672498800123

//2022/12/31 23:59:00 123
var UNIX時間をDateオブジェクトに変換 = new Date(UNIX時間_2023年)

「月末」や「月初」を取得する

日付を変更できれば、月末や月初が取得できます。

日付に1を指定すれば月初を、0を指定すれば月末(月初の1日前)を指定できます。

同じ要領で-1,-2…と遡っていけば「月末の前日」等も取得できます。

//2022/12/31 00:00:00 000 
var Dateオブジェクト = new Date(2022,11,31)

var UNIX時間_今月初 = Dateオブジェクト.setDate(1)
var UNIX時間_前月末 = Dateオブジェクト.setDate(0)

//2022/12/1 00:00:00 000 
var Dateオブジェクト_今月初 = new Date(UNIX時間_今月初)

//2022/11/30 00:00:00 000 
var Dateオブジェクト_前月末 = new Date(UNIX時間_前月末)

「昨日」や「3時間後」を取得する

上の項目でDateオブジェクトの情報を変更できました。これができれば「1日前」や「3時間後」を取得する事ができます。


//2022/12/31/23:59:59 123のDateオブジェクトを作成する
var Dateオブジェクト = new Date(2022,11,31,23,59,00,123)

var 前年 = Dateオブジェクト.getFullYear() - 1 //2021
var 前月 = Dateオブジェクト.getMonth() - 1    //11
var 前日 = Dateオブジェクト.getDate() - 1    //30
var 1時間前 = Dateオブジェクト.getHours() - 1  //22
var 1分前 = Dateオブジェクト.getMinutes() - 1 //58
var 1秒前 = Dateオブジェクト.getSeconds() - 1 //-1

var UNIX時間_前年 = Dateオブジェクト.setYear(前年)  
var UNIX時間_前月 = Dateオブジェクト.setMonth(前月)  
var UNIX時間_前日 = Dateオブジェクト.setDate(前日)  
var UNIX時間_1時間前 = Dateオブジェクト.setHours(1時間前)  
var UNIX時間_1分前 = Dateオブジェクト.setMinutes(1分前)  
var UNIX時間_1秒前 = Dateオブジェクト.setSeconds(1秒前)  

//2021/12/31 23:59:00 123
var UNIX時間をDateオブジェクトに変換 = new Date(UNIX時間_前年)

UNIX時間のまま計算を行う

ここまではDateオブジェクトを計算し、計算結果のUNIX時間をDateオブジェクトに戻してきました。

しかしUNIX時間を、UNIX時間のまま計算する事もできます。

UNIX時間は「1970年1月1日0時0分0秒」から現在までに経過した時間を、ミリ秒単位にしたものでした。ですから現在のUNIX時間に1を足せば、現在の1ミリ秒後を出せます。

同じ用に1000を足せば1秒後、60000を足せば1分後が出せます。

var UNIX時間 = Date.now()

//1日後は何ミリ秒か計算する
var 日 = 1
var 時 = 日 * 24 //24時間
var 分 = 時 * 60 //1440分
var 秒 = 分 * 60 //84400秒
var ミリ秒 = 秒 * 1000 //84400000ミリ秒

var UNIX時間_明日 = UNIX時間 + ミリ秒
var Dateオブジェクト = new Date(UNIX時間_明日)

「第一営業日」や「最終営業日」を判定する

今までと違い、営業日を判定する時は少し難易度が上がります。会社によって休みの日が異なる場合があるからです。

ここの解説は少し長くなってしまうので別記事にまとめました。営業日を判定したい場合はご参照下さい。

【GAS】会社独自の休日もOK! 第一営業日・最終営業日を取得する方法を解説します

3. formatDate

「2022/12/31」や「23:59」のような特定のフォーマットで時刻を表現したい時はUtilities.formatDate(時刻,タイムゾーン,文字列)を使います。

時刻は現在時刻ならnew Date()を使います。タイムゾーンは「どの国の時間を表示するか」という意味で、日本なら”JST”を指定しましょう。

後は文字列に特定の文字を入れると、下記のように変換してくれます。逆に変換できない文字はそのまま残ります。

文字 結果 説明
yy 22
yyyy 2022
MM 12
MMM Dec
MMMM Decenber
w 52
W 5 月の何週目か
D 365 今年の何日目か
d 31
F 4 今週の何日目か
u 5 今週の何日目か
EEEE Friday 曜日
E Fri 曜日
a PM AM/PM
H 23 時(0-23)
k 23 時(1-24)
K 11 時 (0-11)
h 11 時(1-12)
m 59
s 00
S 123 ミリ秒

そのため下記のような形式で時間を取得できます。

// 2022/12/31
var 年月日 = Utilities.formatDate(new Date(),"JST","yyyy/MM/dd")

//23時になりました!
var 時報  = Utilities.formatDate(new Date(),"JST","H時になりました!")

時間の処理をマスターして自動化のレベルを上げよう

自動化を行うには、プログラムをいつ実行するのかという時間の処理が欠かせません。時間の処理をマスターして、一段上の自動化を目指しましょう。