1. ホーム
  2. javascript

[解決済み] なぜ「2016-02-16」は「2016-02-16 00:00」と同じにならないのですか?

2023-01-25 15:32:55

質問

日付文字列の両方を new Date(t) .

どちらの文字列も同じ時刻を表していると思います。結局のところ、時刻を省略するとその日の真夜中になるはずではありませんか?

しかし、一方で

new Date("2016-02-16 00:00")

は予想通り現地時間の2016-02-16, 0時を返します。

new Date("2016-02-16")

は2016-02-16, midnight UTCを返しますが、これは間違っているか、少なくとも他の文字列がどのように解析されるかを考えると私が期待したものではありません。

ローカルタイムとして時刻を返すか、UTCとして時刻を返すか、両方が同じ動作になるなら理解できますが、このように異なるものを返すのは非常に矛盾しているように思われます。

回避策として、対応するタイムスタンプを持たない日付に遭遇するたびに、一貫した動作を得るために " 00:00" を追加できますが、これはかなり壊れやすいように思われます。

私はこの値を 'datetime-local' タイプの INPUT 要素から取得しているので、ページ要素によって返される値を操作しなければならないのは特に一貫性がないように思われます。

私は何か間違ったことをしているのでしょうか、それとも何か違うことをしなければならないのでしょうか?

どのように解決すればよいのでしょうか?

それは ES5.1仕様 に書いてあることです。

不在のタイムゾーンオフセットの値は "Z "です。

とも書いてあります。

<ブロッククオート

この関数はまず、Date Time String Format (15.9.1.15) で呼び出された規則に従って、Stringの書式を解析することを試みます。Stringがそのフォーマットに適合しない場合、この関数は実装固有のヒューリスティックや実装固有の日付フォーマットにフォールバックすることがあります。

フォーマットは T の区切り文字が必要なため、有効な時刻はUTCになります。

> new Date("2016-02-16T00:00:00")
Tue Feb 16 2016 01:00:00 GMT+0100 (CET)
> new Date("2016-02-16")
Tue Feb 16 2016 01:00:00 GMT+0100 (CET)

...一方、node.jsでは、無効な時間(Tセパレータなし)は、実装固有のlocaltimeに行くようです。

> new Date("2016-02-16 00:00:00")
Tue Feb 16 2016 00:00:00 GMT+0100 (CET)

なお、ES6では が変更され これは、同じ の部分で に変化します。

タイムゾーンオフセットがない場合、日付時刻はローカル時刻として解釈されます。

の喜びは 変化への挑戦 .

編集

によると TC39 にあるように、この仕様は、タイムゾーンを含まない日付と時刻の文字列(例:"2016-02-16T00:00")はローカル(ISO 8601による)として扱い、日付のみの文字列(例:"2016-02-16")はUTC(ISO 8601と整合しない)として解釈することが意図されています。