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での実行時は環境変数
TZ
をAsia/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
実行環境が違うから環境変数でどうにかできるかな?というのをまず気付きたいケースだった