サーバー側でそれらにZを追加する必要がありますか?
TL; DRはい、おそらくそうすべきです。
残念ながら、タイムゾーンなしでの日付と日付/時刻の正しい処理は、仕様とJavaScriptエンジンが仕様に準拠しているという点で、何年にもわたって変化してきました。
この回答が最初に2013年に作成されたとき、ES5仕様(JavaScriptの日付/時刻形式が定義された最初の仕様であり、ISO-8601のサブセットであることが意図されていました)は明確でした。タイムゾーンなし= UTC:
不在のタイムゾーンオフセットの値は「Z」です。
しかし、それはISO-8601とは相容れませんでした。ISO-8601では、タイムゾーンインジケータがないことは「現地時間」を意味します。一部の実装では、ES5の意味を実装せず、代わりにISO-8601に固執していました。
ES2015 (別名「ES6」)では、ISO-8601に一致するように変更されました。
タイムゾーンオフセットがない場合、日時は現地時間として解釈されます。
ただし、これにより、既存のコード、特にのような日付のみのフォームとの非互換性の問題が発生し2018-07-01
たため、ES2016ではさらに変更されました。
タイムゾーンオフセットがない場合、日付のみのフォームはUTC時間として解釈され、日時フォームは現地時間として解釈されます。
したがってnew Date("2018-07-01")
、UTCとしてnew Date("2018-07-01T00")
解析されますが、現地時間として解析されます。
それ以来、ES2017と次のES2018で一貫しています。現在の編集者の下書きへのリンクは次のとおりです。この下書きには、正確なテキストは含まれていませんが、同じ方法で定義されています(ただし、IMHOはあまり明確ではありません)。
ここで現在のブラウザをテストできます。
function test(val, expect) {
var result = +val === +expect ? "Good" : "ERROR";
console.log(val.toISOString(), expect.toISOString(), result);
}
test(new Date("2018-07-01"), new Date(Date.UTC(2018, 6, 1)));
test(new Date("2018-07-01T00:00:00"), new Date(2018, 6, 1));
2021年9月現在の状況:
- Firefox、Chrome、Safariの最新バージョンは、iOSブラウザを含めてこれを正しく実現しています(AppleはJITを実行する場合、独自のJavaScriptエンジンを使用できないため、現在すべてAppleのJavaScriptCore JavaScriptエンジンを使用しています)
- IE11はそれを正しくします(興味深いことに)
2018年4月現在の状況:
- IE11はそれを正しくします(興味深いことに)
- Firefoxはそれを正しく理解します
- Chrome 65(デスクトップ、Android)で問題ありません
- Chrome 64(iOS v11.3)が日付/時刻フォームを間違って取得する(UTCとして解析)
v11.3のiOSSafariは、日付/時刻の形式が間違っています(UTCとして解析されます)
奇妙なことに、v6.4(Chrome 64のv8)とv6.5(Chrome 65のv8)の間で修正されたv8の問題リストに問題が見つかりません。私はまだ開いているが、修正されたように見えるこの問題を見つけることができるだけです。