web-dev-qa-db-ja.com

moment.jsを使用して現在のユーザーのタイムゾーンのIDを検出します

私が探しているのは、ブラウザのタイムゾーンID( Olsonテーブル で定義されている)を検出する方法ですが、正確なIDは気にせず、必要なのはタイムゾーンのIDだけです。ユーザーのものと同じように機能します(たとえば、ユーザーがパリにいる場合は「ヨーロッパ/ローマ」で問題ありません)。

現在のオフセットには興味がありません。他の日付の計算を行うためにサーバーに送信できるように、タイムゾーンが本当に必要です(サーバーにはOlsonテーブルもあります)。

理論的には、すでに Moment.jsタイムゾーンライブラリ を使用しており、Olsonテーブルが含まれているため、他に何も必要ありませんが、検出を行うためのAPIが見つかりません。それがどこかに隠されているのか、誰かがすでに書いているのかはわかりません。問題の1つは、現在のタイムゾーンプラグインがデータをプライベートに保っているように見えることです。

私はいけません 'オルソンテーブルのさらに別のコピーまたは抽出の統合に基づくソリューションが必要です(これは維持する必要があります)、私はそこで知っていますそれらを複製するいくつかのライブラリです。Moment.jsにすでにあるものを使用したいと思います。

20
Denys Séguret

モーメントは現在、guess() AP​​Iを ここで説明 として持っています

7

その検出を行うための小さなスクリプトを作成しました。利用可能なタイムゾーンのIDを登録することから始め、次にmatches関数の呼び出しで、現在の時刻と4か月後および8か月後の時刻のすべてのタイムゾーンIDをテストします(異なる日光のタイムゾーンを除外するため)ルール)と5年前。

ここにあります :

<script src="moment-with-langs.min.js"></script>
<script src="moment-timezone.min.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
var tzdetect = {
    names: moment.tz.names(),
    matches: function(base){
        var results = [], now = Date.now(), makekey = function(id){
            return [0, 4, 8, -5*12, 4-5*12, 8-5*12, 4-2*12, 8-2*12].map(function(months){
                var m = moment(now + months*30*24*60*60*1000);
                if (id) m.tz(id);
                return m.format("DDHHmm");
            }).join(' ');
        }, lockey = makekey(base);
        tzdetect.names.forEach(function(id){
            if (makekey(id)===lockey) results.Push(id);
        });
        return results;
    }
};
</script>

タイムゾーンIDが1つだけ必要な場合は、

var tzid = tzdetect.matches()[0];

デモンストレーション

GitHubリポジトリ: https://github.com/Canop/tzdetect.js

更新:ここに示されているコードは、moment.jsの最新バージョンと互換性がありません。維持されている(無料で使用できる)コードについては、 GitHubリポジトリ を参照してください。

2017更新:タイムゾーンを推測するためのAPIがmoment.jsにあります。それがおそらく今のところ最良の解決策です。

17
Denys Séguret

標準のJavaScriptAPIを使用する場合は、 Intl.DateTimeFormat.resolvedOptions ブラウザサポートがある場合:

Intl.DateTimeFormat().resolvedOptions().timeZone; // "America/Los_Angeles"

resolvedOptionsは現在(2016年1月)iOSとデスクトップのSafariを除くすべてのブラウザで利用できます: http://caniuse.com/#feat=internationalization

ただし、timeZoneプロパティは現在 Chromeでのみ使用可能 です。

8
Denys Séguret