2016-03-20 9 views
3

標準JSライブラリ(ECMA5)を使用して、momentjsまたは外部ライブラリを使用せずに、「ヨーロッパ/ローマ」などのTimeZone文字列を使用してUTCオフセットを計算する方法"America/Los_Angeles"?JavaScriptでTimeZone文字列を指定してUTCオフセットを計算する

UTCオフセットはDSTかどうかによって異なりますので、ソリューションでローカルクライアントの日付を指定されたタイムゾーン文字列に変換する必要がある場合は意味があります。目標は、UTCからのオフセットを知ることです。

function getUtcOffset(timezone) { 
    // return int value. 
    // > 0 if +GMT 
    // < 0 if -GMT. 
} 

答えて

2

あなたが要求された操作を実行することができますするECMAScript(ECMA-262)での機能はありません。これは、標準ECMAScriptがローカルコンピュータとUTC以外のタイムゾーンについて何も知らないためです。

function getTimezoneOffset(d, tz) { 
    var a = d.toLocaleString("ja", {timeZone: tz}).split(/[\/\s:]/); 
    a[1]--; 
    var t1 = Date.UTC.apply(null, a); 
    var t2 = new Date(d).setMilliseconds(0); 
    return (t2 - t1)/60/1000; 
} 

これは、現在のバージョンで動作します:

しかし、ECMAScriptの国際化API(ECMA-402)をサポートし、完全にIANAタイムゾーンデータベース識別子をサポートするブラウザでは、あなたが一緒にこのような機能をハックすることができますクロムの、そしておそらく他のいくつかの場所で。確かにどこでも働くことは保証されていません。特に、どのバージョンのInternet Explorerブラウザーでも動作しません。

使用例(Chromeで):

getTimezoneOffset(new Date(2016, 0, 1), "America/New_York") // 300 
getTimezoneOffset(new Date(2016, 6, 1), "America/New_York") // 240 
getTimezoneOffset(new Date(2016, 0, 1), "Europe/Paris") // -60 
getTimezoneOffset(new Date(2016, 6, 1), "Europe/Paris") // -120 

この特定の機能について注意すべきいくつかのこと:私が述べたと同様

  • 、どこでも仕事に行くのではありません。最終的には、すべてのブラウザが現代の標準に追いついていますが、現時点ではそうなりません。

  • あなたが渡した日付が実際に結果に影響します。これは、夏時間とその他のタイムゾーンの異常によるものです。 の現在のの日付はnew Date()とちょうど一致しますが、関数の呼び出し時に結果が変わります。 the timezone tag wikiの "time zone!= offset"を参照してください。

  • この関数の結果は、Date.getTimezoneOffsetと同じです。正の値は、西の(UTC)です。 ISO8601オフセットで作業している場合は、時間に変換して符号を反転する必要があります。

  • 機能はtoLocaleString機能の機能をフォーマットする時間帯に依存しています。私は'ja'カルチャーを選んだ。なぜなら、日付部分はすでに配列の正しい順序になっていたからだ。これは確かにハックです。理想的には、フォーマット時にロケールにバインドせずにタイムゾーン情報にアクセスできるようにするAPIがあります。残念ながら、この特定のAPIの設計者は、タイムゾーンをロケールに関連付ける間違いを犯しました。これは、さまざまな言語のいくつかの他のAPIで作成された間違いであり、残念ながらここでJavaScriptに組み込まれています。はっきり言い換える

    :ECMA-402の唯一のタイムゾーン機能は、設計上の欠陥、私見である文字列をフォーマットするときタイムゾーンを適用することです。

  • 上記の使用例のセクションには、このAPIが間違っている理由の一部を示すバグがあります。具体的には、Dateオブジェクトを作成するときにタイムゾーンを指定する方法はありません。私が渡した1月1日と7月1日は、ローカルタイムゾーンで作成され、指定されたタイムゾーンでは作成されません。したがって、出力は、トランジションの近くで期待しているものと正確に一致しない場合があります。これは、この問題を回避するためにさらにハッキングされる可能性がありますが、私はそれをあなたに練習として残します。

アゲイン - 関与外部ライブラリが存在しないとして、この答えは、を求めた基準を満たすものの、私は強くすべての製品コードでこれを使用してに対するをお勧めします。あなたがこれで何か重要なことをするつもりなら、私はone of the libraries I listed hereを使います。私の個人的な好みは、とmoment-timezoneアドオンです。なぜなら、私はそのライブラリのメンテナンスを手伝ってくれるからです。 YMMV

5

瞬間タイムゾーンを確認しましたか?

moment.tz("America/Los_Angeles").utcOffset(); 
+0

それは素晴らしい答えですが、結局私はmomentjを使うことができません。私はparseZoneを持っている本当に古いバージョンにはまっていますが、*。*はありません。古いmomentjsには、単にタイムゾーンフルネームのルックアップテーブルがありません。可能であれば、ネイティブJSでこれを行う方法が必要です。 –

+0

'.tz'であり、データは[moment-timezone](http://momentjs.com/timezone)アドオンで個別に提供されます。 –

+0

ありがとう@MattJohnson。しかし、私は瞬間タイムゾーンを追加する必要はありません。私は完全にソフトウェアを所有していないので、libsを変更するのは簡単ではありません。 –

関連する問題