Qiita Conference 2025 Autumn

からあげ

生成AI時代のテックブログの始め方

0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaScript】有効な日付をisNaN()で判定できない場合

Posted at

挨拶

初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すため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の比較になるためエラー処理を行うことができます。

0
0
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

Comments

ffngud588
@ffngud588
if(date_str <> date.getDate()){
---不適切な日付の場合実行される
}

JavaScriptに<>という演算子はありませんよ。

0

Let's comment your feelings that are more than good

Qiita Conference 2025 Autumn will be held!: 11/5(Wed) - 11/7(Fri)

Qiita Conference is Qiita's largest tech conference, dedicated to engineers in the age of AI!

Keynote Speaker

piacere, Tsuyoshi Ushio, Esteban Suarez, Takuto Wada, seya, MinoDriven, Toshihiro Ichitani, Karaage, Yoshimasa Iwase, Matz, Minorun and more…

View event details

Being held Article posting campaign

0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address