cronのタイムゾーン問題|UTCサーバーで日本時間に動かす方法
最終更新: 2026-07-19
「日本時間の朝9時に動かしたいのに、なぜか夕方に動く」——クラウドサービスのcronで最も多いトラブルがタイムゾーンのずれです。原因はシンプルで、多くのクラウド環境がcron式をUTC(協定世界時)で解釈するためです。日本時間(JST)はUTCより9時間進んでいます。
なぜ9時間ずれるのか
サーバーのタイムゾーンがUTCの場合、0 9 * * *は「UTCの9時」=「日本時間の18時」に実行されます。国内のレンタルサーバー等はJST設定のことも多いのですが、GitHub ActionsやVercelなど海外発のサービスはUTC固定が基本です。
JST→UTCの変換(9時間引く)
日本時間で動かしたい時刻から9時間引いた値を書けば、UTCサーバーでも狙った時刻に動きます。
- JST 9:00 → UTC 0:00 →
0 0 * * * - JST 12:00 → UTC 3:00 →
0 3 * * * - JST 6:00 → UTC 21:00(前日)→
0 21 * * *
当サイトのcron式ツールには「実行サーバーのタイムゾーン」の切り替えがあり、UTCを選ぶと「その式が手元の日本時間で何時に動くか」を換算表示します。答え合わせに使えます。
見落としやすい「曜日またぎ」
JSTの深夜〜早朝(0:00〜8:59)は、UTCに直すと前日になります。たとえば「日本時間の月曜7時」はUTCでは「日曜22時」です。時刻だけ9時間引いて曜日をそのままにすると1日ずれるので注意してください。
プラットフォーム別の対応
- GitHub Actions:UTC固定。式を9時間引いて書く(近年timezone属性の対応も進行中)。
- Vercel Cron:UTC固定・タイムゾーン指定不可。9時間引く。
- Kubernetes CronJob:
spec.timeZone: "Asia/Tokyo"で日本時間のまま書ける(v1.27+)。 - Spring @Scheduled:
zone="Asia/Tokyo"で指定可能。
※ タイムゾーンを指定できる環境(K8s・Spring・EventBridge Scheduler等)では、9時間引くより「Asia/Tokyoを明示する」ほうが読み間違いを防げて安全です。
ツールの「タイムゾーン=UTC」を選べば、式が日本時間で何時に動くかを換算して表示します。
UTC↔JSTを確認する