夏時間の解説:DST は Unix タイムスタンプにどう影響するか
夏時間は春にローカルの時計を進め、秋に戻します。Unix タイムスタンプは影響を受けません(常に UTC を数える)が、Unix 時間とローカル時刻の間のすべての変換は夏時間が有効かどうかを知る必要があります。本ガイドでは、DST とは何か、どこで適用されるか、それが生むギャップと重複のバグ、そして正しく扱う方法を説明します。
1 分でわかる DST と Unix 時間
夏時間は春にローカルの時計を 1 時間進め、秋に 1 時間戻します。Unix タイムスタンプは決して動きません——UTC 秒を数え、すべての切替を通してまっすぐ刻みます——なので DST に対して影響を受けません。変わるのは、それに対して表示するローカル時刻です。2 つの切替がほぼすべての DST バグを引き起こします。春の前進ギャップ(ローカル時刻の 1 時間が決して起きない)と、秋の後退の重複(1 時間が 2 回起きる)です。下の表は主要な地域がいつ切り替えるかを示します。
| 地域 | 春の切替(前進) | 秋の切替(後退) | 時計の変化 |
|---|---|---|---|
| 米国・カナダ | 3 月第 2 日曜 | 11 月第 1 日曜 | 02:00 → 03:00 ローカル |
| 欧州連合 | 3 月最終日曜 | 10 月最終日曜 | 01:00 UTC、+1 時間 |
| 英国 | 3 月最終日曜 | 10 月最終日曜 | GMT ↔ BST |
| オーストラリア(実施州) | 10 月第 1 日曜 | 4 月第 1 日曜 | 南半球 — 逆 |
夏時間とは何か
夏時間(DST)は、夕方の明るさを延ばすために 1 年のうち一定期間ローカルの時計を 1 時間進める慣行です。現在およそ 70 か国が実施しており、ほとんどが温帯緯度です。切替は壁時計の時刻の不連続であって UTC の不連続ではありません——Unix タイムスタンプはすべての前進と後退を通して滑らかに刻み続けます。
- 北半球:時計は通常 3 月に進み、10 月/11 月に戻る
- 南半球:時計は 10 月に進み、3 月/4 月に戻る
- 熱帯・赤道地域は一般に DST を実施しない
- DST は夕方の明るさを 1 時間増やすが、日照の総量は変えない
DST 切替は Unix タイムスタンプにどう影響するか
Unix タイムスタンプは 1970 年 UTC 以降に経過した秒数なので、先へ飛んだり繰り返したりできません。変わるのはその秒のローカル時刻としての解釈です。春の前進切替では、ローカルの時計が 02:00 から 03:00 へ飛び——02:00 から 02:59 までの壁時計時間はローカルでは決して起きません。後退では、ローカルの時計の 01:00 から 01:59 が、UTC で 1 時間の差をもって 2 回起きます。
- Unix タイムスタンプが DST によってスキップされたり重複したりすることはない
- ある Unix タイムスタンプは、オフセットを含めて特定のローカル時刻に対応する(PDT vs PST、BST vs GMT など)
- あるローカル時刻は、ゼロ個(DST ギャップ)または 2 個(DST 重複)の Unix タイムスタンプに対応しうる
- IANA 名(America/Los_Angeles)を使って DST を自動適用させる。その地域が DST を実施するなら UTC−8 のようなオフセットを決してハードコードしない
DST ギャップと DST 重複の解説
2 つの切替が 2 つの典型的な DST バグを生みます。春の前進ギャップは、スケジューリングとリマインダーの失敗の最も一般的な原因です——切替日の 02:30 に設定したイベントはローカルに存在しません。秋の後退重複はより微妙です——切替日の 01:30 のイベントは 1 時間離れて 2 回存在します。いずれの場合も明示的な方針が必要です。
| 切替 | 時計の動き | ローカル時刻への影響 |
|---|---|---|
| 春の前進 | 02:00 → 03:00 | 02:00–02:59 は決して存在しない(「ギャップ」) |
| 秋の後退 | 02:00 → 01:00 | 01:00–01:59 が 2 回起きる(「重複」) |
- ギャップ:ISO 8601 / RFC 3339 はギャップ内の時刻を一意に表現できない
- 重複:どちらの出現かを明示的なオフセット(UTC−5 vs UTC−4)で注記する
- Python:zoneinfo は fold 属性でギャップ/重複を扱う(0 = 1 回目、1 = 2 回目)
- JavaScript Temporal:ZonedDateTime は曖昧性解決オプションを取る("earlier"、"later"、"compatible"、"reject")
- DST 地域の 02:30 の cron は、春の前進でスキップするか秋の後退で 2 回発火する——可能なら UTC でスケジュールする
どの地域が DST を実施するか
DST の採用はまだら模様で、定期的に変わります——ルールをハードコードせず、常に現在の IANA tzdata を参照してください。以下は 2026 年についておおむね正確です。
- 米国:ほとんどの州が DST を実施(3〜11 月)。アリゾナ(ナバホ・ネイションを除く)とハワイは実施しない
- カナダ:ほとんどの州が DST を実施。サスカチュワン、ユーコンの大半、そして(2026 年以降)ブリティッシュコロンビアの大半は実施しない
- 欧州連合:DST を実施(3 月最終日曜 → 10 月最終日曜)。2019 年の廃止投票は先送りされている
- 英国:夏に BST(UTC+1)として DST を実施
- メキシコ:2022 年に全国 DST を廃止。米国に合わせた国境自治体のみがなお実施
- オーストラリア:NSW、ビクトリア、タスマニア、ACT、南オーストラリアのみが DST を実施(10〜4 月)
- アジア、アフリカ、南米の大半:DST なし
コードで DST を安全に扱う
信頼できる方法は、すべてを Unix タイムスタンプ(または IANA ゾーン付きの日時)に固定し、ローカル時刻を表示の問題として扱うことです。
- 保存:Unix エポック秒、またはタイムゾーン対応の datetime(例:Postgres の TIMESTAMPTZ)
- 計算:UTC、または IANA 対応の日時ライブラリ(Temporal、zoneinfo、java.time)で
- 表示:レンダリング時にユーザーの IANA タイムゾーンへ変換
- スケジュール:「ローカル 9 時」に保つべき繰り返しイベントには、ローカルの壁時計とともに IANA タイムゾーンを保存する
- IANA 名の代わりに EDT/PDT/CET の略称を決して保存しない
DST 廃止への動き
複数の議会が年 2 回の時計変更の廃止を可決していますが、実際の政策変更につながった投票はわずかです。最近の注目すべき動き:
- 2022 年:米上院が Sunshine Protection Act を全会一致で可決したが、下院で停滞
- 2022 年:メキシコが全国 DST を廃止
- 2024 年:トランプが恒久 DST に公然と反対し、上院の勢いが鈍化
- 2026 年:ブリティッシュコロンビアが恒久 UTC−7 となり、米下院エネルギー・商業委員会が新たな DST 廃止の条文を前進させた
- 2019 年:EU は原則として DST 廃止を可決したが、実施を繰り返し延期している
関連リファレンス
FAQ
- DST は Unix タイムスタンプに影響しますか?
- いいえ。Unix タイムスタンプは 1970 年以降の UTC 秒を数え、すべての DST 切替を通して滑らかに進み続けます。変わるのはその秒のローカル時刻としての解釈だけです。
- 曖昧な時刻とは何ですか?
- 曖昧な時刻とは、2 つの異なる UTC 時点に対応するローカル時刻です。秋の切替で、時計が 02:00 から 01:00 へ戻り、01:00–01:59 の時間が 2 回起きるときに発生します。明示的なオフセット、またはライブラリの fold/曖昧性解決オプションで一意にします。
- DST 切替時にスケジュールされたジョブはどうなりますか?
- DST 地域で 02:30 にスケジュールした cron ジョブは、スキップされる(春の前進)か、2 回実行される(秋の後退)かのどちらかです。修正は UTC でスケジュールするか、明示的に曖昧性を解決するスケジューラーを使うことです。
- コードでは "EST" と "America/New_York" のどちらを使うべきですか?
- America/New_York です。IANA 名は冬に EST(UTC−5)、夏に EDT(UTC−4)を自動で適用します。\"EST\" をハードコードすると、値は 1 年の半分で誤りになります。
- コードで DST を正しく扱うには?
- UTC(または IANA ゾーン付きの日時)で保存・計算し、表示のときだけローカル時刻に変換します。America/New_York のような IANA ゾーン名を使い、固定オフセットや EST のような略称は使わないでください。そうすれば DST が自動で適用されます。
- 2026 年の DST はいつ始まり、いつ終わりますか?
- 米国では、DST は 2026 年 3 月 8 日のローカル 02:00 に始まり(03:00 へ前進)、2026 年 11 月 1 日のローカル 02:00 に終わります(01:00 へ後退)。EU では切替は 2026 年 3 月 29 日と 10 月 25 日です。