1. ホーム
  2. javascript

new Date("2017-01-01") と new Date("2017-1-1") の違いは何ですか?[重複】しています。]

2023-10-03 08:57:18

質問内容

I 入力 new Date("2017-01-01") を入力すると、出力はその時間が8であることを示しますが new Date("2017-01-1")new Date("2017-1-01") は、その時間が両方とも0であることを示しています。 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 (中国标准时间)*

どのように解決するのですか?

"2017-01-01"に従います。 ES5 日付時刻文字列フォーマット (ISO 8601 Extended Formatの簡略化) という文字列は、UTC時間であり、中国では午前8時です。それ以外の文字列は、Chromeでは現地時間として解析されます。 1 .


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

Chromiumの日付の解析は、ES5の標準的なルールだけでなく、これらの特別なルールにも従います。

  • 最初の数字の前にある認識できない単語は無視されます。
  • 括弧で囲まれたテキストは無視されます。
  • 符号なし数字で、その後に : は時間値であり、この値に TimeComposer . に続く数値は :: は2つ目の0も追加します。数字の後に . は時間でもあり、ミリ秒が続かなければなりません。それ以外の数値は日付の構成要素であり、その後に DayComposer .
  • 月の名前 (または本当に: 月の名前と同じ最初の 3 文字を持つすべての単語) は、名前付き月として Day コンポーザーに記録されます。
  • 時間帯として認識される単語は、そのように記録されます。 (+|-)(hhmm|hh:) .
  • レガシーな日付は余分な符号を許しません ( + または - ) または一致しない ) が読み込まれた後 (最初の数字の前では、どんなゴミでも許されます)。
  • ES5ルールと上記のルールを満たす文字列は、ES5ルールを使ってパースされます。これはつまり "1970-01-01" はローカルタイムゾーンではなく、UTC タイムゾーンになります。

どういう意味ですか?

まず、"2017-01-01"がUTC時間でパースされるのは、"date-time"文字列ではなく、"date"文字列で、ES5の定義に合致することに注目してください。もしtimeが添付されていれば、ISO標準に従ってローカルタイムでパースします。

例を挙げます。

  • 2017-01-01 - UTC時間では2017年1月1日
  • 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日