2016-08-22 9 views
3

コンソール出力:なぜこれらの日付は異なるのですか?ここで

new Date(2016, 08, 22) 
Thu Sep 22 2016 00:00:00 GMT+0200 (CEST) 

new Date("2016, 08, 22") 
Mon Aug 22 2016 00:00:00 GMT+0200 (CEST) 

異なるヶ月が、なぜ?

+2

異なる日付ノート:月は '0'で始まり、'新しい日付(年月日) 'を使うときは+1を加算します。 – Satpal

+0

@ Satpal-まったく同じコンストラクタが使われます[* Date *](http://ecma-international.org/ecma-262/7.0/index.html#sec-properties-of-the-date-constructor))。違いは、単一の文字列引数と数値引数を扱う方法です。 – RobG

答えて

7

JavaScriptの月は数字の場合は0ですが、文字列の解析では、08は標準の日付形式の「8月」の文字列変換であるため、8月に割り当てられます。 here

  1. 新しい日付を(上述のよう Dateは異なる方法で呼び出されています)。
  2. 新しい日付(値);
  3. 新しい日付(dateString);
  4. 新しい日付(年、月[、日[、時[、分[秒[ミリ秒]]]]);

あなたの場合、3 &のフォーマットが呼び出されています。コメントからRobGの入力@

>> new Date(2016, 08, 22) 
>> Thu Sep 22 2016 00:00:00 GMT+0530 (IST) 
>> new Date(2016, 01, 22) 
>> Mon Feb 22 2016 00:00:00 GMT+0530 (IST) 
>> new Date(2016, 0, 22) 
>> Fri Jan 22 2016 00:00:00 GMT+0530 (IST) 
>> new Date("2016-08-22") 
>> Mon Aug 22 2016 05:30:00 GMT+0530 (IST) 
>> new Date("2016/08/22") 
>> Mon Aug 22 2016 00:00:00 GMT+0530 (IST) 

... ISO 8601拡張フォーマットは完全に 実装に依存するよりも、他のofstringsを解析します。 "2016、08、22"の解析結果は、無効な日付を含む何でもかまいません。

+1

文字列の解析に関するコメントには、ISO 8601拡張形式以外の文字列の解析が完全に実装に依存することが含まれている必要があります。 "2016、08、22"の解析結果は、無効な日付を含む何でもかまいません。 – RobG

2

使用二Dateコンストラクタは"Dec 25, 1995"のように、日付の(既知の)文字列表現を解析することを意図しています。あなたが渡す形式は標準的なものではないので、結果が正しい日付に近い場合でも(DhruvPathakが指摘しているように月の値を修正することで修正できる)、結果として使用するべきではありませんランタイム/ブラウザで

+0

Dateコンストラクタ(またはDate.parse)を使用して "Dec 25、1995"を解析すると、無効な日付を含むすべての結果が生成されることがあります。 'new Date('12。25、1995 ')'を指定すると、Firefoxは構文エラーを返します。 – RobG

+0

それを指摘してくれてありがとう。私は、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parseの文書をもう一度見ています。「Stringが標準形式に準拠していない場合、関数は、実装固有のヒューリスティックまたは実装固有の解析アルゴリズムにフォールバックする可能性があります。作業が保証されている唯一のフォーマットはISO-8601のようです。 "他の形式を使用することもできますが、結果は予期しないことがあります"。 –

+0

"* may well *"は "will"でなければなりません。 ISO 8601でさえ、完全にまたは一貫してサポートされているわけではなく(確かに動作することは保証されていません)、ISO 8601の日付を解析するときにECMA-262自体が標準から逸脱します。要点は、常に文字列にパーサーを使用し、常に解析する形式を指定することです。 – RobG

関連する問題