【保存版】GASでの「Day.js」ライブラリの使い方を徹底解説【日付操作をマスターしよう!】

GASを使っていて、「特定の日にトリガーを発動させたい!」とか「海外圏の人のために、日付や曜日表記をその国に合わせたい!」等、細かい日付の指定が必要になる場面が多々あります

Dateオブジェクトだけでは限られた日付操作しか行えないため、複雑な日付処理が必要な場合に苦慮した経験がある方も多いかもしれません

こーすけ先生

そこで、今回はライブラリ「Day.js」を使用することで、柔軟で簡潔な日付処理が可能になるよ!ということを解説したいと思います!

本記事の内容
  • GASで直感的に日付操作を行う方法を解説
  • 「Day.js」ライブラリについての解説
  • 「Day.js」ライブラリの使い方、留意事項のまとめ
こーすけ先生

Day.jsを組み合わせることで、特定の日時や条件に基づいてトリガーを設定する処理を簡潔に行うことができます!

本記事では「Day.js」ライブラリの使い方を徹底解説します!
使いこなせたら、めちゃくちゃ便利なので、是非読んでいってください!

この記事の執筆者について
  • GASの人
  • ITベンダSEとして12年勤務する中で民間、金融、官公庁の現場を一通り経験済
  • 現在は公務員をやりながら起業に向けて着々と準備中
GASなら任せろ!

​GASを極めたい方や、業務の効率化を図りたい方は、ぜひこの記事を読んください!
難しいことはGASに任せて、我々人間は楽しちゃいましょう!

こーすけ先生

当ブログでは実際に仕事でGASを扱っている私が、GASの魅力について徹底的に取り上げていきます!

目次

GASのライブラリについて

本記事で取り組む演習
  • GASで直感的に日付操作を行う方法を解説
  • 「Day.js」ライブラリについての解説
  • 「Day.js」ライブラリの使い方、留意事項のまとめ
こーすけ先生

「もう本題のDay.jsの使い方が見たいぜ!」という方は【「Day.js」を使いこなそう!】までジャンプしてください!

そもそもライブラリって何?

こーすけ先生

ライブラリというのはいわゆる関数の集合体です

そこで、関数や値の集まりをパッケージにして、参照、活用できるようにした仕組みがライブラリです

過去にすごい人たちが作ったライブラリ(Day.js等)を読み込むこともできるし、自分で作成したライブラリを読み込んで使うことができます!

私のブログの中でもsendMailEXcreatePdfといった関数を書いたりしてましたが、あれを毎回書くのは面倒ですよね

こーすけ先生

自分が作成した関数をライブラリに登録することで、複数のプロジェクトに使いまわすこともできるよ!

ライブラリに関数を登録することで、同じコードを複数のプロジェクトで何度も書く手間を省くことができ、さらにメンテナンス性が向上するという利点があります

例えば、異なるプロジェクトで同じ機能を提供する関数を別々に書く場合、コードが間違っていた場合、それぞれのプロジェクトで修正が必要です

しかし、ライブラリに登録した関数が間違っていた場合、元データを修正すれば、登録されている関数を一括で修正することができます

こーすけ先生

そのため、同じ修正を複数回行う必要がなくなり、手間をかけずにメンテナンスを効率的に行うことができます

自分が作ったライブラリではなく外部ライブラリ(Day.jsしかり)を使用する際は、そのライブラリ作成元が活発であるかは確認すべきです!

こーすけ先生

すでに開発がストップしているものも多く、そういう場合は不具合があったとしても放置されることが多々あります
ライブラリを導入する際には機能や軽さだけでなく、更新頻度やスター数、利用数、開発元の信頼性なども考慮しましょう!

Day.jsとは?

Day.jsはJavaScriptの標準的なDateオブジェクトよりも柔軟で簡単に扱える日付処理ライブラリです

こーすけ先生

「Day.js」を使うことで、日付と時刻に関する操作を簡潔に行え、コードの可読性や保守性を向上させることができます

Day.jsは単一のJavaScriptファイルで構成されており、GASとの親和性が高いです
ライブラリから簡読み込むことで、GASの環境で日付操作を直感的に行えるようになります

Day.jsの便利なところ
  • 日付と時刻のフォーマット変更
    Day.jsを使用すると、日付や時刻を特定のフォーマットに変更でき、適切な形式で日付を扱うことができます
  • 特定の日時を取得できる
    月初や月末、年始や年末など、様々な操作が容易に行うことができ、特定の日時パターンや期間を計算する際に、短いコードで処理を実現できます
  • 多言語対応
    Day.jsは多言語に対応しており、ロケールを設定することで、日本語の曜日や月名などを含む地域固有の表記が利用できます
こーすけ先生

月初や月末を指定したり、海外での時刻でトリガーを発動させたり等、直感的で細かい調整をすることができるよ!めちゃくちゃ便利!

ライブラリ「Day.js」を使いこなそう!

本記事で取り組む演習
  • ライブラリ「Day.js」をまるっと使ってみる
  • 現在日時および指定日時オブジェクトの生成
  • 指定フォーマットの出力
  • 各プロパティの取得、設定
  • 日時の加算、減算
  • 日時同士の差分を取得、比較
こーすけ先生

早速、スタンドアロン型でGASエディタを開いてみよう!
開き方は分かるよ!という方は【ここをクリック】して解説に進んでください

GASエディタを開き、「Day.js」をライブラリに追加する

STEP
Googleドライブにアクセスし、左上の [+ 新規] ボタンをクリック
STEP
[その他] の中にある [Google Apps Script] を選択
STEP
エディタが開く
がすぴょん

GASのエディタを開くことができたよ!

Day.jsをライブラリに追加する

STEP
メニューバーから「+(ライブラリを追加)」をクリック
STEP
出てきたダイアログのスクリプトIDに以下のIDを入力し、「検索」をクリック

1ShsRhHc8tgPy5wGOzUvgEhOedJUQD53m-gd8lG2MOgs-dXC_aCZn9lFB

STEP
「追加」をクリックすると、GAS上で「Day.jsライブラリ」を使用できるようになる

上記ダイアログのID欄にデフォルトは「dayjs」と表示されていますが、ここを変更すると、プロジェクト内でdayjsライブラリにアクセスするための文字列を変更できます。が、通常あまりやりません。

現在日時および指定日時オブジェクトの生成

function gaslogDayjs() {
  // 現在日時を取得する
  let now = dayjs.dayjs();

  // 指定日時を取得する
  let assignDate = dayjs.dayjs('2010/4/1 13:55:12');

  console.log(now);
  console.log(assignDate);
}
17:23:17	お知らせ	実行開始
17:23:18	情報	{ '$L': 'en',
  '$d': Mon Dec 04 2023 17:23:18 GMT+0900 (Japan Standard Time),
  '$x': {},
  '$y': 2023,
  '$M': 11,
  '$D': 4,
  '$W': 1,
  '$H': 17,
  '$m': 23,
  '$s': 18,
  '$ms': 175 }
17:23:18	情報	{ '$L': 'en',
  '$d': Thu Apr 01 2010 13:55:12 GMT+0900 (Japan Standard Time),
  '$x': {},
  '$y': 2010,
  '$M': 3,
  '$D': 1,
  '$W': 4,
  '$H': 13,
  '$m': 55,
  '$s': 12,
  '$ms': 0 }
17:23:17	お知らせ	実行完了
がすぴょん

んんん?
この「’en’」ていうのはもしかして「English」の略?

dayjs.dayjs.locale('ja');
こーすけ先生

すごい!よく気付いたね
そうなんだよ!このままだと今後の実行結果がズレてしまうから今のうちに直しておこうね!

function gaslogDayjs() {
  // ロケール設定を日本に変更
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();

  // 指定日時を取得する
  let assignDate = dayjs.dayjs('2010/4/1 13:55:12');

  console.log(now);
  console.log(assignDate);
}

タイムゾーンはGMT+0900 (Japan Standard Time)となっているため、日付操作のみを行う場合は特段ロケールを変更する必要はありませんが、間違いが起こらないように必ず設定するようにしましょう!

こーすけ先生

ちなみに指定日付の場合は、/ではなく-とした場合でも問題なくオブジェクトを生成できます!

let assignDate = dayjs.dayjs('2010-4-1 13:55:12');

指定フォーマットの出力

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();

  console.log(now.format('YYYY-MM-DD HH:mm:ss'));
  
  // 年
  console.log(now.format('YY'));
  console.log(now.format('YYYY'));

  // 曜日
  console.log(now.format('d'));
  console.log(now.format('dd'));
  console.log(now.format('dddd'));
}
17:30:32	お知らせ	実行開始
17:30:33	情報	2023-12-04 17:30:33
17:30:33	情報	23
17:30:33	情報	2023
17:30:33	情報	1
17:30:33	情報	月
17:30:33	情報	月曜日
17:30:32	お知らせ	実行完了
こーすけ先生

生成したdayjsオブジェクトに対して、formatメソッドを用いてパラメタを指定すれば様々な情報を取得することができます

スクロールできます
パラメタ出力例説明
YY232桁年表記
YYYY20234桁年表記
M1, 121桁月表記(2桁のものはもちろん2桁)
MM01, 122桁月表記
MMMM1月, 12月日本語月表記
D1, 311桁日表記
DD01, 312桁日表記
d0, 6数値曜日表記(日曜日を0としてインクリメント)
dd日本語曜日表記(短縮)
dddd月曜日日本語曜日表記
H0, 231桁時間表記(24時間制)
HH00, 232桁時間表記(24時間制)
h0, 121桁時間表記(12時間制)
hh00, 122桁時間表記(12時間制)
m0, 591桁分表記
mm00, 592桁分表記
s0, 591桁秒表記
ss00, 592桁秒表記
SSS000, 999ミリ秒表記
Z+09:00協定世界時 (UTC) との差分
ZZ+0900協定世界時 (UTC) との差分
A または a午前, 午後AM/PMの表記

ロケール設定がenの場合は、MMMdddも意味のあるものとなりますが、jaの場合は他のパラメタ設定と同一であるため、ここでは省略しています

各プロパティの取得、設定

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();

  console.log(now.year());
  console.log(now.month());

  now = now.year(2021);
  console.log(now.year());
}
こーすけ先生

注意点として、月の取得は 0-indexed で行われるため、1月が0、2月が1…といった形になります

Day.js を使用して日付と時刻を取得したり、取得したnow 変数の年を 2021 年に変更したりと、直感的に操作することができます

  console.log(now.day());
// 2(火曜日の意)

  console.log(now.date());
// 5(5日の意)

直感的で明瞭ですが、プロパティの取得・設定時にはひとつ注意点があります
なんとなく、dayと書くと日付が取得できそうですがこれは曜日(日曜日を0としてインクリメント)を取得します

こーすけ先生

日付はdate なのでお間違えの無いよう

日時の加算、減算

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 現在日時を取得する
  let now = dayjs.dayjs();
  console.log(now.format('YYYY-MM-DD HH:mm:ss.SSS'));

  // 加算する
  console.log('1年加算   :' + now.add(1, 'y').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1月加算   :' + now.add(1, 'M').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1週加算   :' + now.add(1, 'w').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1日加算   :' + now.add(1, 'd').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1時間加算  :' + now.add(1, 'h').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1分加算   :' + now.add(1, 'm').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1秒加算   :' + now.add(1, 's').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1ミリ秒加算:' + now.add(1, 'ms').format('YYYY-MM-DD HH:mm:ss.SSS'));

  // 減算する
  console.log('1年減算   :' + now.subtract(1, 'y').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1月減算   :' + now.subtract(1, 'M').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1週減算   :' + now.subtract(1, 'w').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1日減算   :' + now.subtract(1, 'd').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1時間減算  :' + now.subtract(1, 'h').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1分減算    :' + now.subtract(1, 'm').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1秒減算    :' + now.subtract(1, 's').format('YYYY-MM-DD HH:mm:ss.SSS'));
  console.log('1ミリ秒減算 :' + now.subtract(1, 'ms').format('YYYY-MM-DD HH:mm:ss.SSS'));
}

明確に加算:addメソッドと減算:subtractメソッドがありますが、addの引数にマイナスの数値を渡せば減算を行うことはできます

こーすけ先生

これ以降、パラメタはヘビーに登場しますので、一覧で示しておきます!

スクロールできます
パラメタ短縮表記説明
yeary
monthM
weekw
dayd
hourh時間
minutem
seconds
millisecondmsミリ秒
がすぴょん

「日時の加算、減算」ってどういう時に使うの?

こーすけ先生

…例えば、1か月後の期限を計算するとか、与えられた期限や締め切り日から、一定期間前や後の日時を求める場合に活用できるよ!

こーすけ先生

今後、このブログでは、「Day.js」をガンガン活用するから、都度説明するね!

日時同士の差分を取得

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDateFrom = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時を生成する
  let assignDateTo = dayjs.dayjs('2023/6/1 12:59:59');
  
  console.log(assignDateTo.diff(assignDateFrom, 'y'));
  console.log(assignDateTo.diff(assignDateFrom, 'M'));
  console.log(assignDateTo.diff(assignDateFrom, 'd'));
}
17:46:14	お知らせ	実行開始
17:46:15	情報	0
17:46:15	情報	1
17:46:15	情報	60
17:46:15	お知らせ	実行完了

上記プログラムではあえて、基準日時の時刻に対して、比較日時の時刻を1秒前としました

このようにした場合、2023/4/12023/6/1で見れば2ヶ月の差分がありますが、厳密にミリ秒単位で評価をすると2ヶ月になりきっていないため、1ヶ月となります

こーすけ先生

そのため、diffメソッドを用いる際は、ミリ秒単位で評価しているということに注意しましょう

  // 基準日時を生成する
  let assignDateFrom = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時を生成する
  let assignDateTo = dayjs.dayjs('2023/6/1  13:00:00');

2023/6/1の時間を「12:59:59」から「13:00:00」に変えると、実行結果は以下のようになります

17:46:14	お知らせ	実行開始
17:46:15	情報	0
17:46:15	情報	2
17:46:15	情報	61
17:46:15	お知らせ	実行完了
がすぴょん

こうしてみるとミリ秒単位で計算されていることが分かりやすいね!

assignDateTo.startOf('day').diff(assignDateFrom.startOf('day'), 'M');

あくまでも日付だけで評価をしたいとか評価する対象が明確な場合には、上記のようにdayjsstartOfendOfメソッドを併せて用いるとよいです
例えば先ほどのような、基準日時と比較日時であろうと、互いの00:00:00時点の評価となり、2ヶ月の差分が取得できます

日時同士の比較

これにはisBeforeisSameisAfterの3つのメソッドを用います

こーすけ先生

まずは、プログラムから見ていきたいと思います

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDate = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時_前を生成する
  let assignDate_Bef = dayjs.dayjs('2023/2/1 13:00:00');
  
  // 比較日時_後を生成する
  let assignDate_Aft = dayjs.dayjs('2023/6/1 13:00:00');
  
  console.log(assignDate_Bef.isBefore(assignDate));
  console.log(assignDate_Aft.isBefore(assignDate));
  
  console.log(assignDate_Bef.isSame(assignDate));
  console.log(assignDate_Aft.isSame(assignDate));
  console.log(assignDate_Bef.isSame(assignDate, 'y'));
  console.log(assignDate_Aft.isSame(assignDate, 'y'));
  
  console.log(assignDate_Bef.isAfter(assignDate));
  console.log(assignDate_Aft.isAfter(assignDate));
}
17:55:41	お知らせ	実行開始
17:55:41	情報	true
17:55:41	情報	false
17:55:41	情報	false
17:55:41	情報	false
17:55:41	情報	true
17:55:41	情報	true
17:55:41	情報	false
17:55:41	情報	true
17:55:41	お知らせ	実行完了
こーすけ先生

比較メソッドもdiffと同じくですが、明確に評価対象をパラメタ指定することで比較結果を変化させることができます

isBeforeメソッド

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDate = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時_前を生成する
  let assignDate_Bef = dayjs.dayjs('2023/2/1 13:00:00');
  
  // 比較日時_後を生成する
  let assignDate_Aft = dayjs.dayjs('2023/6/1 13:00:00');
  
  console.log(assignDate_Bef.isBefore(assignDate)); //true
  console.log(assignDate_Aft.isBefore(assignDate));  //false
}

isBeforeメソッドは、指定した日時がメソッドを呼び出した日時よりも前にあるかどうかを確認します

返り値は真偽値で、指定した日時がメソッドを呼び出した日時よりも前にある場合は true を、それ以外の場合は false を返します

isSameメソッド

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDate = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時_前を生成する
  let assignDate_Bef = dayjs.dayjs('2023/2/1 13:00:00');
  
  // 比較日時_後を生成する
  let assignDate_Aft = dayjs.dayjs('2023/6/1 13:00:00');
  
  console.log(assignDate_Bef.isSame(assignDate));        //false
  console.log(assignDate_Aft.isSame(assignDate));        //false
  console.log(assignDate_Bef.isSame(assignDate, 'y'));   //true
  console.log(assignDate_Aft.isSame(assignDate, 'y'));   //true
}

isSameメソッドは、指定した日時がメソッドを呼び出した日時と同じであるかどうかを確認します

返り値は真偽値で、指定した日時がメソッドを呼び出した日時と同じ場合は true を、それ以外の場合は false を返します

isAfterメソッド

function gaslogDayjs() {
  dayjs.dayjs.locale('ja');
  // 基準日時を生成する
  let assignDate = dayjs.dayjs('2023/4/1 13:00:00');
  
  // 比較日時_前を生成する
  let assignDate_Bef = dayjs.dayjs('2023/2/1 13:00:00');
  
  // 比較日時_後を生成する
  let assignDate_Aft = dayjs.dayjs('2023/6/1 13:00:00');
  
  console.log(assignDate_Bef.isAfter(assignDate));      //false
  console.log(assignDate_Aft.isAfter(assignDate));      //true
}

isAfterメソッドは、指定した日時がメソッドを呼び出した日時よりも後にあるかどうかを確認します

返り値は真偽値で、指定した日時がメソッドを呼び出した日時よりも後にある場合は true を、それ以外の場合は false を返します

こーすけ先生

これらのメソッドを組み合わせることで、日時の関係性を柔軟に確認することができます
特定の日時がある基準日時の前後や同一性を確認する場合に便利です!

ちょっと便利な使い方

日付操作は、プログラムの中で結構頻繁に行われるかと思います

これまで紹介した使い方以外に例えば、月初月末翌月末年始年末年度末などを取得したい時があるかと思います

こーすけ先生

そんな時は、以下を参考にしてみてください!

月初(startOf)

let now = dayjs.dayjs();
console.log(now.startOf('M').format('YYYY-MM-DD HH:mm:ss'));
こーすけ先生

現在日時の月初を取得し、指定したフォーマットでコンソールに出力しています
月初を取得する場面では、例えば月次の処理などが考えられます!

月末(endOf)

let now = dayjs.dayjs();
console.log(now.endOf('M').format('YYYY-MM-DD HH:mm:ss'));
こーすけ先生

現在日時の月末を取得し、指定したフォーマットでコンソールに出力しています

翌月末(add(1, ‘M’).endOf(‘M’)):

let now = dayjs.dayjs();
console.log(now.add(1, 'M').endOf('M').format('YYYY-MM-DD HH:mm:ss'));
こーすけ先生

現在日時から1ヶ月後の月末を取得し、指定したフォーマットでコンソールに出力しています

年始(startOf(‘y’))

let now = dayjs.dayjs();
console.log(now.startOf('y').format('YYYY-MM-DD HH:mm:ss'));
こーすけ先生

現在日時の年初を取得し、指定したフォーマットでコンソールに出力しています

年末(endOf(‘y’))

let now = dayjs.dayjs();
console.log(now.endOf('y').format('YYYY-MM-DD HH:mm:ss'));
こーすけ先生

現在日時の年末を取得し、指定したフォーマットでコンソールに出力しています
年末を取得する場面としては、年次の終了処理や期限の終了などが考えられます

年度末

let now = dayjs.dayjs();
if (now.month() >= 3) {
  console.log(now.add(1, 'y')
                 .month(2)
                 .endOf('M').format('YYYY-MM-DD HH:mm:ss'));
} else {
  console.log(now.month(2)
                 .endOf('M').format('YYYY-MM-DD HH:mm:ss'));
}

現在日時が4/1~12/31であれば年度末は翌年となるため、現在年に1を加算させたのちに、3月の末日を取得します

こーすけ先生

月が4月以降であれば、現在日時の年度末を取得し、それ以外の場合は、現在の年の3月末を取得します

まとめ

今回は「dayjs ライブラリを用いて、GASの日付操作で楽をしよう!」というテーマで解説を行いました
GASで使用することのできる「Day.js」ライブラリの代表的なメソッドや使い方をひたすらお伝えしました

こーすけ先生

本記事で取り扱ったようにGASはライブラリを追加することで、プログラムをより簡潔に記述することも可能です
引き続き、GASを楽しんでいきましょう!!

ぜひ、皆さんも実業務での活用に取り組んでみてください
引き続き、GASを楽しんでいきましょう!!

こーすけ先生

X(旧:Twieer)にて、ブログの更新やQiita記事の更新、GAS情報をお届けしますので、是非フォローしてください!

100日後に起業する公務員

こーすけ先生

退職までの漫画をゆるくXにて更新中!
是非フォローしてね!

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

GASの人。ITベンダSEとして12年勤務し、民間、金融、官公庁の現場を一通り経験済。html、css、JavaScript、Java、PHPも分かります。最近は専らGASで小規模アプリケーションを頻繁に作成しています。GASのことなら何でもお任せあれ!現在は公務員として働きながら、起業に向けて着々と準備中です!

コメント

コメントする

CAPTCHA


目次