notebook

都内でWEB系エンジニアやってます。

dayjsで実行時のタイムゾーンを指定する

dayjsを使ったスクリプトをローカル、GitHubActionsともに実行したいという状況になった

GitHubActionsは実行環境のタイムゾーンがUTCだったので結果に差が出てしまった

今回のケースではどちらの実行でもAsia/Tokyoのタイムゾーンで実行したい

ということで、環境変数の指定で実行時のタイムゾーンを統一する

うっかりCI環境とローカル環境で違うから…プラグイン入れて…というコードを書いてしまいそうになったので残しておく

dayjs

内部的にはDateを使っている

デフォルトではDateはローカルタイムゾーンを用いている、ローカルと異なるタイムゾーンで実行したい場合はTZの環境変数を指定する

  • 実行環境のタイムゾーンの確認
$ node -e 'console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)'
Asia/Tokyo

以降実行時の環境(ローカル)はAsia/Tokyo

$ TZ='UTC' node -e "console.log(new Date().toString())"
Sun Aug 18 2024 11:25:15 GMT+0000 (Coordinated Universal Time)

$ TZ='Asia/Tokyo' node -e "console.log(new Date().toString())"
Sun Aug 18 2024 20:25:07 GMT+0900 (Japan Standard Time)

2つのコマンド実行の差異が若干あるが、ほぼ9時間ずれた状態で出力される

  • dayjsを用いてサンプルコードを実行してみる
$ TZ="UTC" node -e 'const dayjs = require("dayjs"); console.log(dayjs().format("YYYY-MM-DD HH:mm:ss"))'
2024-08-18 11:18:47

$ TZ="Asia/Tokyo" node -e 'const dayjs = require("dayjs"); console.log(dayjs().format("YYYY-MM-DD HH:mm:ss"))'
2024-08-18 20:18:54

こちらもTZを指定することでデフォルトのタイムゾーンを指定できた

TZを設定しておけば任意のタイムゾーンですべての処理をさせられる

コード中でタイムゾーンを切り替えるなどの必要がない限り、わざわざpluginなどをいれる必要はなさそう

まとめ

ということで、冒頭の要件だと

  • ローカル実行時は特に何も指定せずスクリプト実行
  • GitHubActionsでの実行時は環境変数TZAsia/Tokyoに指定して実行
      - name: hoge
        env:
          TZ: "Asia/Tokyo"
        run: |
          node script.js

でOKだった

おまけ

手元に環境があったのでmomentでも試してみたが同様にTZの指定でタイムゾーンを指定できそうだった

$ node -e 'const moment = require("moment"); console.log(moment().format("YYYY-MM-DD HH:mm:ss"))'
2024-08-24 09:56:23

$ TZ="UTC" node -e 'const moment = require("moment"); console.log(moment().format("YYYY-MM-DD HH:mm:ss"))'
2024-08-24 00:56:30

実行環境が違うから環境変数でどうにかできるかな?というのをまず気付きたいケースだった