JavaScript はブラウザ上で動く言語であり、その実装は実行環境に依存しています。このためあるブラウザでは実行可能なコードがあるブラウザでは実行不可能という事態がしばしば起きます。
よくあるのが、次の様なフォーマットで日時を処理しようとするときのエラーです。
const dateStrMySQL = '2021-10-05 17:47:00'; new Date(dateStrMySQL);// Safari でエラー
どのブラウザでも対応すべき、とされている日時フォーマットは次リンクにある ISO 8601 フォーマットのみです。
ECMAScript® 2022 Language Specification
ISO 8601 – Wikipedia
JavaScript 内で日時を扱う際はこの ISO 8601 で行うべきなのですが API レスポンスの日時がこの形式でない時がしばしばあります。自分の環境では MySQL 内の日時文字列がそのまま API レスポンスになっていることがしばしばあります。こういった際、都度 API を直すのは手間なので API レスポンスが共通で通る場所なりなんなりでフォーマットを変更するのが望ましいです。次のコードが JavaScript で MySQL 形式の日時文字列を ISO 8601 形式に変換するコードです。
// この正規表現はグループ化が主目的であり、MySQL の正常な日時文字列が dateStr に入っている前提です。 // MySQL 形式の日時文字列として正当であるか否かの判定用正規表現では \d+ で雑にやっている部分を煮詰めることになります const mysqlFormat = /^(\d+)-(\d+)-(\d+)(?: (\d+):(\d+):(\d+))?$/; if (dateStr.match(mysqlFormat)) { dateStr = dateStr.replace(mysqlFormat, (match, y, m, d, hour, min, sec) => { return hour ? `${y}-${m}-${d}T${hour}:${min}:${sec}.000+09:00` : `${y}-${m}-${d}T00:00:00.000+09:00`; }); } const dateInstance = new Date(dateStr);
MySQL 形式の日時文字列が dateStr に格納された状態で↑のコードを実行すると MySQL 形式の日時文字列が ISO 8601 形式の日時文字列に変換され Date オブジェクトのコンストラクタに渡されます。これを次の様にするなどして日時を扱う時に常に扱う様にすると不正な日時フォーマットエラーを避けやすくなります。
const makeDate = (dateStr: string): Date => { // この正規表現はグループ化が主目的であり、MySQL の正常な日時文字列が dateStr に入っている前提です。 // MySQL 形式の日時文字列として正当であるか否かの判定用正規表現では \d+ で雑にやっている部分を煮詰めることになります const mysqlFormat = /^(\d+)-(\d+)-(\d+)(?: (\d+):(\d+):(\d+))?$/; if (dateStr.match(mysqlFormat)) { dateStr = dateStr.replace(mysqlFormat, (match, y, m, d, hour, min, sec) => { return hour ? `${y}-${m}-${d}T${hour}:${min}:${sec}.000+09:00` : `${y}-${m}-${d}T00:00:00.000+09:00`; }); } return new Date(dateStr); }; const dateInstance = makeDate('2021-08-12 11:35:17');