GitHub Actionsのcronを日本時間(JST)で設定する方法
結論を先に。GitHub Actions の schedule の cron は必ず UTC で解釈され、タイムゾーンは指定できません。日本時間(JST)で動かしたい時刻から9時間引いた値を UTC の cron として書きます。たとえば毎朝9時(JST)に動かしたいなら 0 0 * * *(UTC 0時 = JST 9時)です。
# JST 09:00 に実行したい → UTC 00:00on: schedule: - cron: "0 0 * * *"日付や曜日を入れると計算がずれやすいので、JST↔cron 変換ツールを作りました。日本時間を入れれば貼れる cron が出ますし、既存の cron が JST で何時に走るかも確認できます。
原因:cron は UTC 固定
GitHub Actions のスケジュールは、ワークフローの schedule に書いた cron を UTC として扱います。TZ などでタイムゾーンを変える仕組みはありません。ローカルが日本時間の感覚で 0 9 * * * と書くと、それは UTC 9時 = JST 18時に動いてしまいます。
対処:9時間引く
JST は UTC+9 なので、cron の時(hour)フィールドから9を引きます。
- 日中の時刻はそのまま引くだけです。
JST 15:00 → UTC 06:00 → cron: "0 6 * * *"- JST が0時〜8時台のときは、9を引くと前日になります。時は
+15して、曜日や日付を1日戻します。
JST 07:00 → UTC 22:00(前日)→ 毎日なら "0 22 * * *"- 曜日を指定するときは、この「前日ずれ」で曜日もずれます。平日(月〜金)の JST 7時なら、UTC では日〜木の22時です。
JST 平日 07:00 → cron: "0 22 * * 0,1,2,3,4" # UTC 日〜木つまずきやすい点
- 分(minute)は JST でも UTC でも同じなので、毎時実行
M * * * *はそのまま使えます。 - 曜日は 0 が日曜、1〜6 が月〜土です(7 も日曜として使えます)。
- 定刻ぴったりには起動しません。GitHub 側の混雑で数分〜十数分遅れることがあり、高負荷な時刻(毎時0分など)は特に遅れがちです。厳密な時刻が必要な処理には向きません。
まとめ
- GitHub Actions の cron は常に UTC。タイムゾーン指定は不可
- JST の時刻から9時間引いて書く
- JST 9時より前は UTC で前日になり、曜日・日付が1日ずれる
- 分はJSTとUTCで同じ。毎時実行はそのまま
- 起動は数分〜十数分遅れることがある
- 計算が面倒ならJST↔cron 変換ツールを使う
- 関連:締切タイムゾーン時計 / CS系の締切タイムゾーンの整理