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 CronJobspec.timeZone: "Asia/Tokyo"で日本時間のまま書ける(v1.27+)。
  • Spring @Scheduledzone="Asia/Tokyo"で指定可能。

※ タイムゾーンを指定できる環境(K8s・Spring・EventBridge Scheduler等)では、9時間引くより「Asia/Tokyoを明示する」ほうが読み間違いを防げて安全です。

ツールの「タイムゾーン=UTC」を選べば、式が日本時間で何時に動くかを換算して表示します。

UTC↔JSTを確認する