JavaScript で Asia/Tokyo
や America/Los_Angeles
のような IANA Time Zone Database で定義されたタイムゾーン名を取得する方法ですが、
結論
結論から言うと、正確に取得する方法はありません。
JavaScript の Date には、タイムゾーン名を取得する API がないからです。
var date = new Date();
date.toString(); // => "Fri Sep 19 2014 04:49:59 GMT-0700 (Pacific Daylight Time)"
date.getTimezoneOffset(); // => 420
- Date を文字列化すると夏時間も考慮したタイムゾーンの名前が出力されて惜しい感じですが、仕様が決まっているわけではないのでブラウザ毎に違っていて使えません
- Date.getTimezoneOffset() は、UTC からのオフセットを分単位(でも正負は逆)で返しますが、タイムゾーン名を引けるわけではないのでやはり使えません。一口に UTC-0700 といっても、夏時間のある・なしを加味してその地域を特定するのは厄介な問題です
代替案
とはいえ、世の中には同じ問題を抱えている人がいるもので、ブラウザ実行環境のタイムゾーンを予測するライブラリは存在します。
var name = jstz.determine().name();
name;
// (UTC+09:00) 大阪、札幌、東京
// => "Asia/Tokyo"
// (UTC-08:00) 太平洋標準時 (米国およびカナダ)
// => "America/Los_Angeles"
// (UTC-07:00) 山地標準時 (米国およびカナダ)
// => "America/Denver"
// (UTC-07:00) アリゾナ
// => "America/Phoenix"
あらかじめライブラリ内に定義した地域ごとの夏時間の有無やオフセットの情報と、Date.getTimezoneOffset() などを組み合わせて、最もそれらしい地域を算出しているようです。
アリゾナは夏時間を採用していない珍しい州なのですが、UTC からのオフセットが同じ7時間の山地標準時ときちんと区別できていることが分かります。すごいです。
注意事項
- jsTimezoneDetect は、本家にも書いてあるとおり、タイムゾーンが完全に同じ地域の都市(ex. ベルリンとストックホルム)を区別できるわけではないので、そのような用途には向きません。 「ユーザーにタイムゾーン名を指定させたくないけど、サーバー側でユーザーの(ローカル時間に従った日時計算をするために)タイムゾーン名を知りたい」 という用途で効果を発揮すると思います
- 私もまだがっつり使ったわけではないので、確実にオススメできる情報というわけではありません。試してみた範囲ではわりと正確に予測できていると思いますが、自己責任でご利用ください(メンテナンスも止まってしまっている模様)