挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
結論
getDate()で取得できる日情報とテキスト形式の日情報を比較し、等しいかをもって判定します。
Dateオブジェクトに変更しisNaN()で判定する
JavaScriptでは、テキスト形式で日付を入力することがあります。カレンダーなどではなくテキスト形式で入力する場合、2025/2/30のような年、月、日それぞれの値は有効な範囲ではあるが、存在しない日付が入力される恐れがあります。後続の処理でこれを日付としてSQLの条件句に入れるなどした場合、エラーの原因となるためこれはチェックしたいです。
こうした「テキスト形式の日付が有効な日付であるかどうか判定したい」場合、定番なのは一度Date型に変換しgetDate()の結果がNaNであるかを調べる方法です。
var date = new Date("2025/02/100");
if(isNaN(date.getDate())){
---ここに不適切な日付が入力された際の処理を入力
}
これはDate型は不適切な日付を指定された場合、InvalidDateを返し、InvalidDate.getDate()がNaNを返すことを利用したロジックです。しかし、Date型は日付の各値の範囲が適正である場合(例えば"2025/02/31"などの場合)はInvalidDateを返さず日付のオーバー分を加算した適切な日付を返してしまいます。
var date = new Date("2025/02/31");
if(isNaN(date.getDate())){
---2/31は存在しないがここの処理は実施されない
}
これは先ほど例に挙げた「後続の処理でSQLの検索で日付にその文字列を指定する」などの場合チェックは通っているのにエラーとなってしまう原因になります。
Dateオブジェクトに変更しgetDate()と日付を比較する
そこで、事前に日付形式が分かっている場合は日を取得し直接getDate()と比較する方が確実です。例えば、YYYY/MM/DD形式で入力されることが分かっている場合は以下のような判定が有効です。
var input_str = "2025/02/31";
var date_str = input_str.split("/")[2];--"31"
var date = new Date(input_str);
if(date_str != date.getDate()){
---不適切な日付の場合、実行される
}
(実際には本当にinput_strがYYYY/MM/DD形式となっているかのチェックや各値が数値となっているかのチェックを事前に行うべきでしょう。)
この方法でしたら、日付が32のような不適切な場合は32とNaNの比較となり、2/31のような値は適切だが日付としては不適切な場合は31と3の比較になるためエラー処理を行うことができます。
10/30追記
存在しない比較演算子が使用されていたためコード部date_str <> date.getDate()をdate_str != date.getDate()に修正しました。ご指摘ありがとうございます。