2016-06-17 4 views
1

私はmomentjsを使用して特定の日付をフォーマットしています。以下は、異なるタイムゾーンに異なる振る舞い:moment.jsタイムゾーンの不一致

moment(new Date("2016" + "-" + "06" + "-01").toISOString()).format('MMMM YYYY')

それは私にアメリカ/デンバーのタイムゾーンでMay 2016、アジア/カラチでJune 2016を与えます。ブラウザのタイムゾーンを別のタイムゾーンに変更してテストしました。両方ともJune 2016である必要があります。

new Date()のフォーマットを、以下のようなハイフンの代わりにスラッシュを使用するように変更すると、どちらのタイムゾーンでも正確な結果が得られます。つまり、May 2016です。

moment(new Date("2016" + "/" + "06" + "/01").toISOString()).format('MMMM YYYY')

の両方がこの矛盾の原因となるか、有効なISOの文字列であるように見えますか?

+0

'new date(" 2016 "+" - "06" + "-01")toISOString() 'は' 2016-06-01T00:00:00Z'を生成します。 – RobG

答えて

4

あなたの質問に対する短い答えは、javascriptの日付のパーサは誰にも意味をなさない方法で機能しないということです。代わりに、モーメントのパーサを使用して、必要な結果を得るだけです。意味のある方法で日付を解析することは、瞬間が存在する理由の約50%です。 日付の呼び出しを取り除き、Momentを使用して日付を解析すると、Momentのデフォルトのコンストラクタを使用している場合、文字列が現地時間と解釈されるため、次のコードが2016年6月にブラウザに表示されることがわかります。

moment('2016-06-01').format() 

あなたが使用したい場合は、代わりにスラッシュ、それは次のようになります。

moment('2016/06/01', 'YYYY/MM/DD').format() 

See moment's parsing guide for more information about how moment interprets times with it's different constructor methods.

長い答えは、あなただけの日付であるISO8601形式の文字列を渡すときということですJavaScriptの日付コンストラクタは、その文字列をUTCとして解釈します。デンバーは昼間にはUTC -6であり、カラチは常にUTC +5であるため、モーダルがローカルタイムとしてタイムスタンプを表示すると、結果が表示されます。あなたは次のことを観察することができます。

var a = new Date('2016-06-01'); 
a.toISOString(); 
"2016-06-01T00:00:00.000Z" 

注toISOStringは常にUTCタイムスタンプを返すよう上記タイムスタンプの「Z」は、それがUTCであることを示していること。そのタイムスタンプはカラチでは6月、カラチはUTCよりも前にあるのに対し、デンバーでは5月がUTCの後ろにあるためです。

だけでなく、これを守ってください。

var a = new Date('2016-06-01T00:00'); 
a.toISOString(); 
"2016-06-01T05:00:00.000Z" 

私は、文字列に時間を置く場合、それは現地時間として解釈されます。私のタイムゾーンは1月1日のUTC-5だったので、グローバルタイムライン上のポイントは、渡された文字列よりも5時間遅れていました。

2016-06-01をUTCとして解釈し、2016-06-01T00:00をローカルとして解釈するという振る舞いは、実際にはブラウザー間の技術的負債に対応するための努力です。 It has been made the standard behavior in the 7th edition of the ECMA 262 specificationですので、変更しないようにしてください。 See this link as well.

スラッシュ(2016/06/01)を使用すると、使用しているJS実装が、ECMA規格のいずれの形式にも準拠していないため、その形式を現地時間と解釈することを選択しています。これは有効なISO8601フォーマットではありません。この動作は実装固有であり、ブラウザ/環境によって異なることに注意することが非常に重要です。 The ECMA standard does not define a behavior for parsing that date format.他のブラウザは、この文字列を他の方法で解析することができます。

一般的なアドバイスとして、JavaScriptの日付パーサーは使用しないでください。それは正しく動作しません。瞬間のいくつかの競合相手の1つであるMoment.jsを使用するか、手作業で文字列をパースすることができます。これらのすべてがより良いオプションです。

+0

それは素晴らしいです。問題は、非ISO形式とモーメントパーサーを使用するときに得られる非推奨警告です。 – xmaestro

+0

そして私はこれまで、Dateコンストラクタを使用して警告を回避しました。 – xmaestro

+1

2番目の例のように日付形式を指定してください。その廃止予定の警告を受ける理由はこの質問です。それは日付パーサーに戻り、日付パーサは機能しません。 –