JavaScriptのDateインスタンスがInvalid Dateか判定する方法をまとめた

JS/TS/Node

JavaScriptのnew Dateで日付の生成に失敗するとInvalid Dateという値を返します。

new Dateの結果がInvalid Dateかどうかを判定する方法をまとめました。

Invalid Dateの判定はできない

JavaScriptではInvalid Dateを表す値やInvalid Dateを判定する関数が公式に存在しないため

new Dateの戻り値がInvalid Dateであることを直接的に判定することができません。

const invalidDate = new Date("invalidDate");
console.log(invalidDate) // Invalid Date

console.log(invalidDate instanceof Date) // true
console.log(invalidDate instanceof Object) // true
console.log(invalidDate === null) // false
console.log(invalidDate === undefined) // false
console.log(new Date("hoge") === invalidDate) // false

new DateがInvalid Dateを返すときは例外も発生しません。

try {
    const invalidDate = new Date("invalidDate");
    console.log(invalidDate)
} catch (e) {
    console.log("例外発生")
}
// Invalid Date

Invalid Dateとは

上記のコードでもわかる通りInvalid DateはnullやundefinedでもなければErrorでもないのです。

Invalid DateはDateクラスのオブジェクトなのです。

存在しない日付や日付に変換できない値でDateオブジェクトを生成するとInvalid Dateになります。

// 存在しない日付
const notexistsDate = new Date("2023/99/99");
console.log(notexistsDate) // Invalid Date

// 日付に変換できない値
const invalidDate = new Date("invalidDate");
console.log(invalidDate) // Invalid Date

Invalid Dateを判定する方法

公式にInvalid Dateを判定する方法がないなら自作するまでです。

1. Invalid Dateを文字列にして比較

const invalidDate = new Date("invalidDate");
if (invalidDate.toString() === "Invalid Date") {
    // Invalid Date時の処理
}

Dateオブジェクトを文字列にしてInvalid Dateかどうかを判定しています。

2. Number.isNaNで判定

// Invalid Dateかどうかを判定するメソッド
const isInvalidDate = (date) => Number.isNaN(date.getTime());

const invalidDate = new Date("invalidDate");
if (isInvalidDate(invalidDate)) {
    // Invalid Date時の処理
}

getTime()関数はDateオブジェクトを数値に変換しますが、できないときはNaNという値を返します。

数値かNaNをNumber.isNaN()に渡すことでInvalid Dateかどうかを判定しています。

つまりDateオブジェクトが数値ならfalseを、Invalid Dateならtrueを返すメソッドを用意しています。

コメント

タイトルとURLをコピーしました