タイムゾーンの仕組み - UTC からの時差はどう決まるのか
タイムゾーンが生まれた歴史的背景から、UTC を基準とした時差の決定方法、各国の採用状況まで体系的に解説します。
Linux の cron デーモンは、デフォルトではシステムのタイムゾーン (/etc/localtime または TZ 環境変数) に基づいてスケジュールを解釈します。「0 2 * * *」と書けば「システムのローカルタイムで午前 2 時」に実行されます。この動作は単一サーバーでは直感的ですが、複数のサーバーが異なるタイムゾーンで動作している環境や、クラウドインスタンスのデフォルト TZ が UTC である環境では、意図しない時刻に実行される原因になります。
AWS EC2 インスタンスのデフォルトタイムゾーンは UTC です。日本時間の午前 2 時にバッチ処理を実行したい場合、cron に「0 17 * * *」(UTC 17:00 = JST 翌 2:00) と書く必要があります。この変換を手動で行うとミスが発生しやすく、サマータイムのある地域ではさらに複雑になります。
サマータイムを採用している地域で cron をローカルタイムで運用すると、年に 2 回問題が発生します。春の切り替え (例: 2:00 AM → 3:00 AM) では、2:00〜2:59 に設定されたジョブがスキップされます。秋の切り替え (例: 2:00 AM → 1:00 AM) では、1:00〜1:59 に設定されたジョブが 2 回実行されます。
データベースのバックアップジョブが 2 回実行されても実害は少ないかもしれませんが、課金処理や集計バッチが 2 回実行されれば深刻な問題になります。逆に、スキップされたジョブが日次の重要な処理であれば、翌日まで気づかない可能性があります。この問題の根本的な解決策は、cron を UTC で運用することです。
サーバーのシステムタイムゾーンを UTC に設定し、cron のスケジュールも UTC で記述するのが最も安全な運用方法です。UTC にはサマータイムがないため、二重実行やスキップの問題が原理的に発生しません。「日本時間の午前 2 時」に実行したい場合は「0 17 * * *」と固定的に記述でき、年間を通じて同じ時刻に実行されます。
ただし、UTC 運用にも注意点があります。「毎月 1 日の午前 0 時 (JST)」に実行したいジョブは、UTC では「前月末日の 15:00」になります。月末日は 28〜31 日で変動するため、cron 式だけでは正確に表現できません。このようなケースでは、ジョブ自体を UTC の固定時刻で起動し、ジョブ内のロジックで「JST で月が変わったか」を判定する設計が必要です。
Kubernetes の CronJob リソースは、v1.27 以降で timeZone フィールドをサポートしています (GA)。spec.timeZone に IANA タイムゾーン名 (例: Asia/Tokyo) を指定すると、スケジュールがそのタイムゾーンで解釈されます。これにより、UTC への手動変換が不要になり、可読性と保守性が向上します。
timeZone フィールドを使用する場合でも、サマータイムの影響は考慮が必要です。Kubernetes のコントローラーはサマータイムの切り替えを認識しますが、切り替え時の動作 (スキップされた時刻のジョブをどう扱うか) はバージョンによって異なる場合があります。重要なジョブは UTC で定義し、timeZone フィールドは人間の可読性が重要な場面に限定して使うのが安全です。
AWS EventBridge Scheduler、Google Cloud Scheduler、Azure Logic Apps などのクラウドスケジューラーは、いずれもタイムゾーン指定をサポートしています。AWS EventBridge では ScheduleExpression にタイムゾーンを指定でき、サマータイムの切り替えも自動的に処理されます。ただし、サマータイムの「存在しない時刻」に設定されたスケジュールの動作は各サービスで異なるため、ドキュメントの確認が必要です。
いずれのサービスを使う場合も、スケジュールの意図をコメントやドキュメントに明記することが重要です。「0 17 * * *」という cron 式だけでは、これが「UTC 17:00」なのか「JST 2:00 を UTC に変換したもの」なのか、後から見た人には判断できません。インフラのコード化 (IaC) においても、タイムゾーンの意図をコメントで残す習慣が保守性を高めます。
この記事は役に立ちましたか?
タイムゾーンが生まれた歴史的背景から、UTC を基準とした時差の決定方法、各国の採用状況まで体系的に解説します。
2 つの都市間の時差を正確に計算する方法を、UTC オフセットの基本から、サマータイムを考慮した実践的な変換手順まで段階的に解説します。
ソフトウェア開発における UTC 変換の正しい実装方法を解説。保存は UTC、表示はローカルの原則から、JavaScript/Python での具体的な実装パターン、よくあるバグの原因まで網羅します。