1

http://jsfiddle.net/mark69_fnd/NhuLe/が生成する出力について誰かが説明してもらえますか?

new Date('2012-07-01') == Sat Jun 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-07-09') == Sun Jul 08 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-07-10') == Mon Jul 09 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-07-31') == Mon Jul 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-1') == Wed Aug 01 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-9') == Thu Aug 09 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-10') == Thu Aug 09 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-08-31') == Thu Aug 30 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-09-1') == Sat Sep 01 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-09-9') == Sun Sep 09 2012 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-09-10') == Sun Sep 09 2012 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2012-12-09') == Sat Dec 08 2012 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2012-12-31') == Sun Dec 30 2012 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-01-01') == Mon Dec 31 2012 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-01-09') == Tue Jan 08 2013 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-02-09') == Fri Feb 08 2013 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-03-09') == Fri Mar 08 2013 19:00:00 GMT-0500 (Eastern Standard Time)
new Date('2013-04-09') == Mon Apr 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-05-09') == Wed May 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-06-09') == Sat Jun 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-07-09') == Mon Jul 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-08-09') == Thu Aug 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2013-09-09') == Sun Sep 08 2013 20:00:00 GMT-0400 (Eastern Daylight Time)

日を計算する方法を理解することに興味があります。2012-07-092012-08-9との違いに注意してください2013-08-09

Chromeで実行しました。

4

2 に答える 2

4

これは非常に興味深く、微妙な質問です。

その理由は、一部の日付が仕様で定義されているISO-8601のような形式であるため、GMTとして解析されますが、他の日付はそうではないため、非標準の日付解析にフォールバックするためです。 (Chromeの場合)代わりに現地時間を使用します。

日付文字列はセクション15.9.1.152012-07-01で指定された形式に準拠しているため、そのセクションの規則に従って、タイムゾーンZ(GMT)で解析されます。次に、それを出力すると、4時間ほど前の現地時間で出力されるため、元の値(時間部分がない)が深夜になると日付が変更されます。

日付文字列はその形式に準拠して2012-08-1いませ0(前にが必要です1)。これは私たちを特定の行動の土地から連れ出します。コンストラクターは、文字列が与えられると、セクション15.9.4.2で定義されているDateと同じルールに従います。Date.parse

この関数は、最初に、日時文字列形式(15.9.1.15)で呼び出されたルールに従って文字列の形式を解析しようとします。文字列がその形式に準拠していない場合、関数は実装固有のヒューリスティックまたは実装固有の日付形式にフォールバックする可能性があります。

(私の強調)

この話の教訓は次のとおりです。指定された形式に固執します。:-)

ただし、注意点として、仕様で定義されている日付/時刻の形式は比較的新しいものです(ES5の時点で、約3年前)。それ以前は、コンストラクター(または解析)が解析する必要のある定義済みの日付/時刻形式はありませんでした。吐き出されたものは何でも解析できなければなりませんでしたが、それは実装固有のものでした。そして、古いブラウザは確かに解析に失敗します。指定されていませんが、ほぼすべてのブラウザー(これまでにテストしたすべてのブラウザー)解析します。もちろん、今度は戻って、彼らが使用しているタイムゾーンを確認したいと思います(そして、それらがすべて同じタイムゾーンを使用しているかどうかを確認します)...DateDateDate#toString2012-08-012012/08/01

于 2012-12-01T11:58:15.063 に答える
0

new Date('2012-07-01')* GMT 000 *0タイムゾーンで日付を指定していることを意味します。

ただし、日付が表示される場合は、ブラウザのタイムゾーン(この場合はGMT -400)でも同じように表示されます。

それが、すべてのタイミングが20:00であると表示される理由です。

于 2012-12-01T11:51:23.660 に答える