夏時間(DST)— ソフトウェアとスケジューリングへの影響
夏時間がソフトウェア、スケジューリング、タイムスタンプ計算にどのように影響するかを理解します。DST遷移のエッジケースとコードでの対処方法を学びます。
Fundamentals
詳細な説明
夏時間とソフトウェアへの影響
夏時間(DST)は、暖かい月に時計を1時間進めて夕方の日照時間を延長する慣行です。概念は単純ですが、ソフトウェアへの影響は驚くほど複雑です。
DSTはいつ発生するか?
DST遷移は国と半球によって異なります:
- 北半球(米国、カナダ、EU):春に進む(3月/4月)、秋に戻る(10月/11月)
- 南半球(オーストラリア、ブラジル):春に進む(9月/10月)、秋に戻る(3月/4月)
- 多くの国はDSTを実施していない:日本、中国、インド、アフリカの大部分など
「春に進む」問題
時計が進むと、1時間がスキップされます。例えば、米国東部時間では午前2:00が午前3:00になります:
午前1:59 EST → (1分経過) → 午前3:00 EDT
午前2:00から午前2:59の時間は、その日には存在しません。春に進む日の午前2:30にスケジュールされたイベントは失敗するか予期しない動作をします。
「秋に戻る」問題
時計が戻ると、1時間が繰り返されます:
午前1:59 EDT → (1分経過) → 午前1:00 EST
午前1:00から午前1:59の時間は、その日に2回発生します。
よくあるバグ
- 期間計算:1日は常に24時間ではありません。DST遷移日は23時間または25時間です。
- 定期イベント:午前2:30の毎日の会議は春に進む日に壊れます。
- Cronジョブ:
30 2 * * *は春に1回スキップし、秋に2回実行されます。 - 日付演算:「1日」を加算する際にDSTを考慮する必要があります。
安全なプラクティス
- タイムスタンプをUTCで保存 — ローカル時間を保存しない
- IANAタイムゾーンIDを使用 — オフセットではなく
- 実績のあるライブラリを使用 — Temporal API、Luxon、date-fns-tz、Joda-Time
- DST遷移をテスト — 春に進む日と秋に戻る日のユニットテストを作成
- 遷移時間帯のスケジューリングを避ける — 可能であれば午前3時から深夜までの間にスケジュール
ユースケース
DST対応は、スケジューリングアプリケーション、カレンダーシステム、アラーム時計、航空券予約システム、金融取引処理、およびDST遷移をまたぐ期間を計算するあらゆるシステムにとって重要です。1時間のエラーはフライトの逃し、不正な請求期間、Cronジョブの重複実行、またはSLAウィンドウの見逃しを意味する可能性があります。