Timestampにおけるタイムゾーンオフセット
timestampにおけるタイムゾーンオフセットの仕組みを解説。オフセットとタイムゾーン名の違い、オフセット付き日付文字列の正しい取り扱い方法。
Concept
+09:00
詳細な説明
タイムゾーンオフセットは、ローカル時刻とUTCの差を±HH:MMで表します。例えば、+09:00はローカル時刻がUTCより9時間進んでいることを意味します(日本標準時や韓国標準時で使用)。-05:00はUTCより5時間遅れていることを意味します(米国東部標準時)。
オフセット形式のバリエーション:
+09:00 ISO 8601標準(コロンあり)
+0900 RFC 2822スタイル(コロンなし)
+09 短縮形(時間のみ、ISO 8601で許可)
Z ゼロオフセット(+00:00と同等)
オフセット vs. タイムゾーン名 — 重要な区別:
+05:30のようなオフセットは現在のUTCとの差を示しますが、どのタイムゾーンルールが適用されるかは示しません。インド標準時(IST)は常に+05:30ですが、「IST」はアイルランド標準時(+01:00)を意味する場合もあります。さらに重要なのは、タイムゾーン名がDSTルールをエンコードしていることです:America/New_Yorkは冬は-05:00ですが夏は-04:00です。オフセットだけではこの変化を表現できません。
2024-01-15T09:30:00-05:00 → 東部標準時 (EST)
2024-07-15T09:30:00-04:00 → 東部夏時間 (EDT)
どちらも: America/New_York
実用上の意味:
オフセット付きtimestampをパースする場合、常に正確にUTCに変換できます。しかし、オフセットだけから元のタイムゾーンを復元することはできません。将来の計算(繰り返しイベントのスケジューリングなど)のためにユーザーのタイムゾーンを知る必要がある場合は、IANAタイムゾーン名をtimestampとともに保存してください。
よくある落とし穴:
JavaScriptのDateオブジェクトはタイムゾーン情報を失います。常に内部的にUTCに変換し、ランタイムのローカルタイムゾーンで表示します。元のオフセットを表示用に保持するには、Intl.DateTimeFormatで明示的なtimeZoneオプションを使用するか、LuxonやTemporal(TC39で策定中の新標準)などのライブラリが必要です。
コードでのオフセット操作:
// JavaScript: 現在のオフセットを分単位で取得
new Date().getTimezoneOffset() // +09:00の場合は-540(符号が反転していることに注意!)
JavaScriptのgetTimezoneOffset()の符号反転は、混乱の原因として有名です。正のオフセットは負の数を返します。
ユースケース
国際チーム向けのミーティングスケジューラーを構築する際、単なるオフセットではなくタイムゾーン名を保存することで、参加者のDSTルールが変わっても繰り返し会議が正しく調整されます。