JavaScript日付検証方法
JavaScriptにおける不正な日付の検出
JavaScriptで不正な日付を検出する方法
JavaScriptでは、Date
オブジェクトを使用して日付と時刻を扱うことができます。しかし、不正な日付(例えば、存在しない日付や時刻)を指定した場合、Date
オブジェクトは自動的に調整された値を返します。そのため、不正な日付を検出するには、いくつかの方法があります。
直接比較
最も単純な方法は、Date
オブジェクトの値を直接比較することです。例えば、月の値が0から11の範囲外であるか、日の値が1から31の範囲外であるかをチェックすることができます。
const date = new Date(2024, 13, 32); // Invalid date: February has only 28 or 29 days
if (date.getMonth() < 0 || date.getMonth() > 11 || date.getDate() < 1 || date.getDate() > 31) {
console.log("Invalid date");
} else {
console.log("Valid date");
}
isNaN関数を使用
isNaN
関数は、引数が数値でない場合にtrue
を返します。不正な日付を指定した場合、Date
オブジェクトの値はNaN
(Not a Number)になります。
const date = new Date("invalid date");
if (isNaN(date.getTime())) {
console.log("Invalid date");
} else {
console.log("Valid date");
}
正規表現を使用
正規表現を使用して、日付の形式を検証することもできます。ただし、すべての可能な日付の形式をカバーすることは困難です。
const dateString = "2024-02-30"; // Invalid date
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
if (!dateRegex.test(dateString)) {
console.log("Invalid date format");
} else {
const date = new Date(dateString);
if (isNaN(date.getTime())) {
console.log("Invalid date");
} else {
console.log("Valid date");
}
}
const date = new Date(2024, 13, 32); // Invalid date: February has only 28 or 29 days
if (date.getMonth() < 0 || date.getMonth() > 11 || date.getDate() < 1 || date.getDate() > 31) {
console.log("Invalid date");
} else {
console.log("Valid date");
}
- 解説
new Date(2024, 13, 32)
で、2024年2月32日を表すDate
オブジェクトを作成します。getMonth()
とgetDate()
メソッドを使用して、月の値と日の値を取得します。- 月の値が0から11の範囲外または日の値が1から31の範囲外であれば、不正な日付と判定します。
const date = new Date("invalid date");
if (isNaN(date.getTime())) {
console.log("Invalid date");
} else {
console.log("Valid date");
}
- 解説
new Date("invalid date")
で、不正な文字列からDate
オブジェクトを作成します。getTime()
メソッドを使用して、ミリ秒単位での日付と時刻を取得します。isNaN
関数を使用して、取得した値が数値でない場合(つまり、不正な日付)を検出します。
const dateString = "2024-02-30"; // Invalid date
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
if (!dateRegex.test(dateString)) {
console.log("Invalid date format");
} else {
const date = new Date(dateString);
if (isNaN(date.getTime())) {
console.log("Invalid date");
} else {
console.log("Valid date");
}
}
- 解説
dateRegex
は、YYYY-MM-DD形式の日付をマッチさせる正規表現です。test
メソッドを使用して、日付文字列が正規表現にマッチするかを判定します。- 正規表現にマッチした場合、
new Date(dateString)
でDate
オブジェクトを作成し、isNaN
関数を使用して日付の妥当性をチェックします。
ライブラリを活用
- Luxon
よりモダンなアプローチを提供するライブラリです。Luxonは、JavaScriptの組み込みDate
オブジェクトよりも効率的で、使いやすくなっています。 - Moment.js
JavaScriptの日付と時刻を扱うための強力なライブラリです。Moment.jsは、日付の検証、フォーマット、操作などの機能を提供します。
カスタム検証関数
- 日付のフォーマットを解析
日付のフォーマットを解析し、その妥当性をチェックする関数を定義することもできます。 - カレンダーの情報を活用
閏年や月の最大日数を考慮したカスタム検証関数を作成することができます。
サーバーサイドの検証
- バックエンド言語(例えば、Node.js)で検証
サーバーサイドで日付の検証を行うことで、クライアント側の操作に依存しない堅牢な検証を実現できます。
例(Moment.jsを使用)
const moment = require('moment');
const dateString = "2024-02-30";
const isValidDate = moment(dateString, 'YYYY-MM-DD').isValid();
if (isValidDate) {
console.log("Valid date");
} else {
console.log("Invalid date");
}
例(カスタム検証関数)
function isValidDate(year, month, day) {
// 閏年の判定
const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
const daysInMonth = [31, isLeapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
retu rn month >= 1 && month <= 12 && day >= 1 && day <= daysInMonth[month - 1];
}
const isValid = isValidDate(2024, 2, 30);
if (isValid) {
console.log("Valid date");
} else {
console.log("Invalid date");
}
javascript date