Webアプリで「ユーザーの現在地」を扱うとき、タイムゾーンの取得方法は2つあります。ところが、この2つの答えが食い違うことがよくあります。なぜなのか、技術的な理由を整理しました。
ブラウザのタイムゾーンはOSから来る
JavaScript でタイムゾーンを取得する標準的な方法はこれです:
Intl.DateTimeFormat().resolvedOptions().timeZone
// 例: "Asia/Tokyo"
この値はブラウザが OS の設定から読み取ったもので、ネットワークとは無関係です。ユーザーが手動で変更すれば、その値が返ります。
IPアドレスのタイムゾーンはジオロケーションDBから来る
もう一つの方法は、IPアドレスから位置を推定するジオロケーション(GeoIP)データベースを使うことです。サーバー側で「このIPはどこの国のものか」を調べて、タイムゾーンを返します。
2つが食い違う典型的な原因
- VPN / プロキシを使っている:IPの出口が海外にあるため、IP側のタイムゾーンが海外になる
- 会社のネットワーク:企業の出口ゲートウェイが本社のある国にある
- クラウドのVM:サーバーのリージョンと利用者の所在地が違う
- ISPの登録情報のズレ:IPアドレスの登録住所と実際の利用地域が一致しないことがある
- 手動でOSのタイムゾーンを変えている:ブラウザ側だけ変わる
つまり「ブラウザのタイムゾーン ≠ IPアドレスのタイムゾーン」はバグではなく、データの出所が違うために起きる正常な現象です。ログイン時の不正検知や、時刻表示のズレの原因調査では、この違いを意識する必要があります。
無料ツールを作りました
この2つの値を並べて一発で確認できる無料ツールを作りました:
▶︎▶︎▶︎ あなたのタイムゾーンは何? - タイムゾーン検出&時差計算 | 17NAS ◀︎◀︎◀︎
できること:
- ブラウザのタイムゾーンとIPアドレス側のタイムゾーンを並べて表示
- UTCオフセット、サマータイム(夏時間)の有無を表示
- 任意の2地点の時差を計算(IANAタイムゾーンデータベース基準、サマータイム考慮)
- 登録不要、ブラウザだけで動作
VPNを使っているときや、海外出張中の時刻確認などに使ってみてください。
(宣伝:このツールは私が作った無料ツールです)