42
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScript でタイムゾーン名を取得する方法

Posted at

JavaScript で Asia/TokyoAmerica/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. ベルリンとストックホルム)を区別できるわけではないので、そのような用途には向きません。 「ユーザーにタイムゾーン名を指定させたくないけど、サーバー側でユーザーの(ローカル時間に従った日時計算をするために)タイムゾーン名を知りたい」 という用途で効果を発揮すると思います
  • 私もまだがっつり使ったわけではないので、確実にオススメできる情報というわけではありません。試してみた範囲ではわりと正確に予測できていると思いますが、自己責任でご利用ください(メンテナンスも止まってしまっている模様)
42
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?