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ルールが変わっても繰り返し会議が正しく調整されます。

Try It — Timestamp Converter

フルツールを開く