2013-01-14 14 views
6

(new Date('2012-12-01')).getMonth()は、11getMonthは0インデックス付け)の代わりに10です。 Firefox、Chrome、Node.jsでテストしましたなぜこれが起こるのですか?(新しい日付( '2012-12-01'))。getMonth()=== 10?

+0

私はFFで試したときに11(期待通り)を返しました。どのブラウザを使用していますか? – nnnnnn

+0

@nnnnnn私はあなたに何を伝えるべきか分からない。 Chrome、Firefox、Node.jsで発生します。 – dbkaplun

+0

私の謝罪;明確化のためにありがとうございます。私は以下の答えを策定しました。 –

答えて

7

タイムゾーンの問題が発生しています。あなたのJSエンジンはその文字列をそれ以上指定されていないのでUTCとして解釈します。 (new Dateによって使用される)specification of Date.parseから:

文字列文字列の内容に応じて、現地時間、UTC時間、またはいくつかの他の時間帯における時刻と解釈されてもよいです。この関数は、まず、Date Time String Format(15.9.1.15)で呼び出された規則に従って、Stringの書式を解析しようとします。 Stringがその形式に準拠していない場合、関数は実装固有のヒューリスティックまたは実装固有の日付形式に戻ります。

タイムゾーンでは、datetimeはNov 30 2012 19:00:00 GMT-0500 - 11月です。 .getUTCMonth()を使用すると、12月になるでしょう。しかし、Date.parseを信用することは決してありません。したがって、Node.jsなどの制限された環境にいない場合は、文字列(正規表現など)を解析してnew Date(Date.UTC(year, month, date, …))にフィードする必要があります。

+0

私は、様々な状況下で異なった動作をするかもしれない構文解析メカニズムよりも、離散入力を使ってDateオブジェクトを構築することに頼る方が全体的に良いアイデアであることに同意します。 –

+0

実際、この仕様はかなり明確だと思います。セクション15.9.1.15は次のように述べています。「タイムゾーンが存在しないため、オフセット値は「Z」です。」(Chromeは正しいので、Firefoxは間違っています) – sinelaw

+1

OK、修正。 [ES5.1仕様の間違い](https://bugs.ecmascript.org/show_bug.cgi?id=112)のように見える - ISO-8601と一致するように意図されていたES5.1、Firefox&IEはISO-8601と一致します) – sinelaw

0

エラーは01の前に0が付いています。分かりません。なぜなら、これはなぜですか。ただし、1より前にゼロを削除すると、正しい月(11)が与えられます。

また、何かを意味する場合は、10月に間違った月を与えることを開始します。

短期修正、Firefox's caseために代わり01

+1

私のためではありません。私は 'NaN'を取得し、' 11'では取得しません。 – dbkaplun

2

1を使用して、少なくとも、RFC2822date specificationsFolding White Spaceによって分離されなければならないと述べています。試してください(new Date('2012 12 01')).getMonth();セパレータとして-の使用法は定義されていないようです。

+0

修正しました。ありがとうございます! – dbkaplun

+0

'new date'がRGC2822を使用するという仕様はありません。 Operaはそれを 'Sat Dec 01 2012 01:00:00 GMT + 0100'のように正しく解析します。 – Bergi

+0

マイナス演算子12 - 01が11月であると私は思っています - 定義されています。 –

関連する問題