new Date("2017-01-01") と new Date("2017-1-1") の違いは何ですか? [重複] 質問する

new Date(

Chrome コンソールに入力するとnew Date("2017-01-01")、出力では時間が 8 であると表示されますが、と の時間は両方とも 0 であるnew Date("2017-01-1")new Date("2017-1-01")表示されます。どのようにnew Date(dateString)解析するのでしょうか?

new Date("2017-01-01")
// Sun Jan 01 2017 08:00:00 GMT+0800 (中国标准时间)*
new Date("2017-01-1")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
new Date("2017-1-1")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
new Date("2017-1-01")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*

ベストアンサー1

「2017-01-01」は ISO標準 に準拠しています ES5 日付時刻文字列形式 (ISO 8601 拡張形式の簡略化)したがって、これは UTC 時間であり、中国では午前 8 時です。その他の文字列はすべて、Chrome 1では現地時間として解析されます。


1 Chromium の関連ソースコード:https://cs.chromium.org/chromium/src/v8/src/dateparser-inl.h?type=cs&l=16

Chromium での日付解析は、標準の ES5 ルールに加えて、次の追加ルールに従います。

  • 最初の数字の前の認識されない単語は無視されます。
  • 括弧内のテキストは無視されます。
  • 符号なしの数値の後に が続く場合は:時刻値であり、 に追加されますTimeComposer。 が続く数値には::、秒のゼロも追加されます。 が続く数値も.時刻であり、ミリ秒が続く必要があります。その他の数値は日付コンポーネントであり、 に追加されますDayComposer
  • 月の名前 (または実際には、月の名前と同じ最初の 3 文字を持つ任意の単語) は、Day作曲家の名前付き月として記録されます。
  • タイムゾーンとして認識できる単語は、そのまま記録されます(+|-)(hhmm|hh:)
  • 従来の日付では、数字が読み取られた後に余分な記号 (+または-) や不一致は許可されません(最初の数字の前では、どのようなゴミも許可されます)。)
  • ES5 ルールと上記のルールを満たす文字列はすべて、ES5 ルールを使用して解析されます。つまり、"1970-01-01"ローカル タイム ゾーンではなく UTC タイム ゾーンになります。

それはどういう意味ですか?

まず、「2017-01-01」は「date-time」文字列ではなく「date」文字列であるため、UTC 時間で解析され、「date」文字列の ES5 定義に一致することに注意してください。時間が添付されている場合は、ISO 標準に従ってローカル時間で解析されます。

例:

  • 2017-01-01- 2017年1月1日(UTC時間)
  • 2017-01-01T00:00- 2017年1月1日(現地時間)
  • 2017-1-1- 2017年1月1日(現地時間)
  • 2017-(hello)01-01- 2017年1月1日(現地時間)
  • may 2017-01-01- 2017年5月1日(現地時間)
  • mayoooo 2017-01-01- 2017年5月1日(現地時間)
  • "jan2017feb-mar01apr-may01jun"- 2017年6月1日(現地時間)

おすすめ記事