safariでnew Date()すると、RangeError: Invalid date value が発生する本当の理由

概要

safariで、

new Date('2023-03-01 12:02:31'

のようなコードを書くと、Invalid Dateが発生することがあります

結論

ISO 8601(基本/拡張形式)に従ったフォーマットを指定しましょう

new Date('2023-03-01T12:02:31')  // 拡張形式に準拠して、日付と時刻の間に区切り文字Tを挿入

理由

ググると、safariでは日付の形式にハイフン使ってはいけないのでスラッシュ「/」を使いましょうみたいな解説の記事が多いですが、「ISO 8601に準拠していない形式では、動作が保証されていない」が正確だと思われます。

Date コンストラクターで日付文字列を解釈する際には、常に入力が ISO 8601 形式 (YYYY-MM-DDTHH:mm:ss.sssZ) であることを確認してください。他の形式で解釈した場合には、その挙動は実装によって定義されていて、すべてのブラウザーで動くとは限りません。

developer.mozilla.org

ISO 8601に準拠するべきと覚えておくと、同様に以下のようなフォーマットでエラーが発生した場合の理解や対処がスムーズになると思います。

new Date('2023-3-21T12:01:13') // 月がMM形式になっていない
new Date('2023-03-21T12.01.13') // 時刻がコロン「:」形式でない

日付の区切り文字がスラッシュ「/」でも多くのブラウザで動くのは、実装依存によるものでJavascriptとしての仕様によるものではないはずです。