O hirunewani blog

Q. Day.jsのisValidメソッドの日付判定が緩い

Created at

Day.jsのisValidメソッドの判定が緩いのは何故かと質問を受けたので、その理由についてまとめた。

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.000ZInvalid Date
Date.parse(”12-22”)1008946800000NaN

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などを利用すると良い。