Q. Day.jsのisValidメソッドの日付判定が緩い
Day.jsのisValidメソッドの判定が緩いのは何故かと質問を受けたので、その理由についてまとめた。
Table of Contents
- # Q. 日付のバリデーション機能が緩い
- # A.
Q. 日付のバリデーション機能が緩い
ユーザー入力による12-22のような日付がバリデーションを突破してしまい、その後dayjsに渡されると2001-12-22として解釈されてしまう。
日付のバリデーションには内部的にDate.parseを利用していた。
A.
V8環境のDate.parseやnew Dateの解析は非常に緩いため、利用を避けた方が良い。
V8 (Chrome, Node, Deno) | JavaScriptCore (Safari) | |
---|---|---|
new Date(”12-22”) | 2001-12-21T15:00:00.000Z | Invalid Date |
Date.parse(”12-22”) | 1008946800000 | NaN |
ISO 8601に従ったもののみを日付として認識してほしいが、まずISO 8601を簡略化した書式に従って解析を行い、実装固有の解析にフォールバックすると仕様にある。
https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.parse
https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date-time-string-format
Date.parse、new Dateは環境によって異なり且つV8環境で緩すぎるため、基本的に利用しない方が良い。ライブラリを追加して良ければdate-fnsなどを利用すると良い。