タイムゾーンオフセット vs タイムゾーンID — なぜ区別が重要か

タイムゾーンオフセット(UTC+05:30)とタイムゾーンID(Asia/Kolkata)の重要な違いを理解します。オフセットの保存がバグにつながる理由を学びます。

Concepts

詳細な説明

タイムゾーンオフセット vs タイムゾーンID

ソフトウェア開発で最も一般的なミスの一つは、タイムゾーンオフセットとタイムゾーン識別子を混同することです。違いを理解することで、時間関連のバグを防ぐことができます。

タイムゾーンオフセットとは?

タイムゾーンオフセットは、特定の瞬間のUTCとの固定された時間と分の差です:

UTC+00:00    (冬のロンドン)
UTC-05:00    (冬のニューヨーク)
UTC+05:30    (インド、年間通じて)

タイムゾーンIDとは?

タイムゾーンIDは、オフセット変更の完全な履歴を持つ地理的地域を識別するIANAタイムゾーンデータベースの文字列です:

Europe/London         # 冬UTC+00、夏UTC+01
America/New_York      # 冬UTC-05、夏UTC-04
Asia/Kolkata          # 常にUTC+05:30

なぜ区別が重要か

ユーザーのタイムゾーンをUTC-05:00として保存した場合を考えます:

  1. 冬、ニューヨークはUTC-05:00(正しい)
  2. 夏、ニューヨークはUTC-04:00(間違い!)

代わりにAmerica/New_Yorkを保存していれば、異なるルールの歴史的な日付を含む任意の日付に対してシステムが自動的に正しいオフセットを適用します。

経験則

  1. タイムゾーンIDを保存し、オフセットは決して保存しない
  2. UTCタイムスタンプ + タイムゾーンIDで計算する
  3. ユーザーのタイムゾーンIDを使用してローカル時間で表示する
  4. UTCまたは明示的オフセット付きのISO 8601文字列を転送する
  5. オフセットが永続的であると決して仮定しない

ユースケース

この区別は、タイムゾーン設定を保存するユーザープロファイル、将来のイベント時間を計算するスケジューリングシステム、定期イベントのあるカレンダーアプリケーション、異なる地域のローカル時間間で変換するあらゆるシステムを構築する際に重要です。IDの代わりにオフセットを使用することは、本番システムにおける時間関連バグの主要な原因です。

Try It — Timezone Reference

フルツールを開く