web-dev-qa-db-ja.com

JavaScriptのDate.getTimezoneOffset()が「-05:00」を正のオフセットと見なすのはなぜですか?

私たちは、タイムゾーンオフセットが "-05:00"Date.getTimezoneOffset()である東部時間帯( "America/New_York")であることに気付きました。 300のpositive数。Utcから西のエリアではオフセットが負で、東のエリアでは正になると予想されます。 Utcのですが、明らかに「反転」しています。その決定の背後にある理由は何ですか?

http://momentjs.com/ は同じルールに従って戻ります...

moment.parseZone("01/13/2014 3:38:00 PM +01:00").zone()   // == -60
moment.parseZone("01/13/2014 3:38:00 PM -01:00").zone()   // == 60

同時に、DateTimePicker http://trentrichardson.com/examples/timepicker/ は、最初の「タイムゾーン」パラメーターを設定するときに数値を反転しません。違いますか?

41
vkelman

それが定義されている方法だからです。ドキュメントの引用( [〜#〜] mdn [〜#〜] ):

タイムゾーンオフセットは、UTCと現地時間の差(分単位)です。これは、ローカルタイムゾーンがUTCより遅い場合はoffsetが正であり、先行する場合は負であることを意味することに注意してください

67
raina77ow

Raina77owの完全に受け入れられる答えについて少し詳しく説明します...

まず、ここに含まれる主な標準が ISO 8601 および RFC 822 (およびその関連物 7112 であることを理解してください& 2822 )、これらはすべて(一部)ANSI X3.51-1975から派生したものです。

これらの標準はすべて、UTC/GMTの東である正の値とUTC/GMTの西である負の値の規則を使用しています。

私が知っている唯一の標準が逆になっているのはPOSIXです( タイムゾーンタグwiki および この記事 のPOSIXセクションを参照してください)。互換性「Etc/GMT + 5」などのOlsonタイムゾーンの符号は反転しています。 (もちろん、他の用途がある可能性がありますが、私はそれらを知らないだけです。)

信じられないかもしれませんが、JavaScriptは両方の方法でそれを行います。 (RFC 822またはISO 8601構文で)文字列として使用する場合、UTCの正のオフセットEastで時間と分を使用します。ただし、DateオブジェクトでgetTimezoneOffset()メソッドを呼び出すと、UTCの正Westである分全体を返します。 。

この矛盾が存在する理由を推測することしかできません。 ECMAScript spec には、このような問題がたくさんあります。おそらく、ISO 8601またはRFC 822文字列にオフセットが表示されている場合、そのオフセットがalreadyが適用されているためです。ただし、getTimezoneOffset()を呼び出すと、UTCに戻すためのオフセットtoが適用されます。

たとえば、_2014-01-01T00:00:00-05:00_は_2014-01-01T05:00:00Z_と同じです。したがって、getTimezoneOffset()は_300_を返します。元の値に300分を追加すると、UTCに戻ります。

同じコインの両面です。見る?

その特定のコントロールが間違っているかどうかに関して、私にはわかりません。私はその特定のコントロールに精通していません。彼らのドキュメントでは-0400が-240に等しい例が見られますが、これは逆になると予想されるかもしれませんが、ユーザーに-240のような値を提示するのは少し奇妙です。実際、どちらの方法でもユーザーにオフセットを公開するべきではありません(IMHO)。 this one または this one のようなタイムゾーンピッカーコントロールを使用する方がはるかに優れています。

14