LoginSignup
7
4

More than 5 years have passed since last update.

【JavaScript】Date.parse()がブラウザ環境によってはNaN(invalid date)を返す理由

Last updated at Posted at 2017-09-29

vue.jsでカウントダウンタイマーを作っていた時に起こった出来事。

ざっくり説明すると
DBに登録しているカウントダウンの終了日付をView側のカスタムコンポーネントに渡す
渡された日付はDate.parse()によって時間値に変換
現在日付も取得し時間値に変換、終了日付までの残り時間を計算していた

<countdown date="2017-10-15 23:59:59"></countdown>

しかし、デスクトップのブラウザ環境では動作したのですが、モバイルのブラウザ環境(※)では
NaN(invalid date)を返す・・・あれ?
※iOSのブラウザ環境

原因

どうやら、Date.parse()に渡す日付文字列が間違っていたみたい
ドキュメントには以下のように書いてありました

引数:dateString
RFC2822 または ISO 8601 の日付を表す文字列 (他の書式が使用されることがあるため、結果は期待値にならない可能性があります)。

RFC2822またはISO 8601の日付???
普段使っている形式と異なり、見慣れていないので戸惑う・・・
new Date()も同様の動作

この日付文字列の形式がブラウザ依存でサポートしていない場合があるみたい
iOSのブラウザ環境だと 2017-10-15 23:59:59 のようなハイフン区切りをサポートしていなくて
invalid dateでエラーをはいていた
デスクトップのブラウザ環境だと大丈夫だったので厄介ですね・・・。

対処法

DBから取得したdatetime型の終了日付を
RFC2822またはISO 8601形式に変換してView側に渡してあげれば正常に動作しました。

ISO8601形式
<countdown date="2017-10-15T23:59:59+09:00"></countdown>
RFC2822形式
<countdown date="Sun, 15 Oct 2017 23:59:59 +0900"></countdown>

まとめ

Date.parse()の日付文字列の解釈は実装依存みたい・・・
形式によっては解析してくれたり、NaNとなる環境もあるみたいなので注意が必要です!

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4