はじめに
この実験では、与えられた文字列が簡略拡張 ISO 形式 (ISO 8601) の有効な日付文字列であるかどうかを判断する方法を探ります。Date コンストラクタとそれに関連するメソッドを使用して、文字列から Date オブジェクトを作成し、その有効性をチェックします。この実験の終わりまでに、JavaScript で日付を扱う方法と、ISO 形式を使って日付を検証する方法をより深く理解するようになります。
この実験では、与えられた文字列が簡略拡張 ISO 形式 (ISO 8601) の有効な日付文字列であるかどうかを判断する方法を探ります。Date コンストラクタとそれに関連するメソッドを使用して、文字列から Date オブジェクトを作成し、その有効性をチェックします。この実験の終わりまでに、JavaScript で日付を扱う方法と、ISO 形式を使って日付を検証する方法をより深く理解するようになります。
コーディングを始める前に、ISO 8601 日付形式とは何か、および JavaScript が日付をどのように扱うかを理解しましょう。
ISO 8601 形式は、日付と時刻を表す国際標準です。簡略拡張 ISO 形式は次のようになります。
YYYY-MM-DDTHH:mm:ss.sssZ
ここで:
YYYY は年を表します (4 桁)MM は月を表します (2 桁)DD は日を表します (2 桁)T は日付と時刻を区切るリテラル文字ですHH は時を表します (2 桁)mm は分を表します (2 桁)ss は秒を表します (2 桁)sss はミリ秒を表します (3 桁)Z は UTC タイムゾーン (ズールー時間) を示しますたとえば、2023-05-12T14:30:15.123Z は 2023 年 5 月 12 日、UTC 時間の午後 2 時 30 分 15.123 秒を表します。
JavaScript は、日付と時刻を扱うための組み込みの Date オブジェクトを提供しています。新しい Date オブジェクトを作成するときに、ISO 形式の文字列を渡すことができます。
const date = new Date("2023-05-12T14:30:15.123Z");
ターミナルを開いて、Date オブジェクトの操作を練習しましょう。
node と入力し、Enter キーを押して Node.js の対話型シェルを起動します。const now = new Date();
console.log(now);

const isoString = now.toISOString();
console.log(isoString);
次のような出力が表示されるはずです。
2023-05-12T14:30:15.123Z
const dateFromIso = new Date("2023-05-12T14:30:15.123Z");
console.log(dateFromIso);

これは、JavaScript が ISO 形式の文字列から Date オブジェクトを解析して作成できることを示しています。
このステップでは、与えられた文字列が有効な ISO 8601 形式であるかどうかをチェックする JavaScript 関数を作成します。
ISO 日付検証器用の新しい JavaScript ファイルを作成しましょう。
isISODate.js と入力し、Enter キーを押します。/**
* Checks if a string is a valid ISO 8601 formatted date string
* @param {string} val - The string to check
* @return {boolean} - Returns true if the string is in ISO format, false otherwise
*/
const isISOString = (val) => {
// Create a Date object from the input string
const d = new Date(val);
// Check if the date is valid (not NaN) and if the ISO string matches the original
return !Number.isNaN(d.valueOf()) && d.toISOString() === val;
};
// Export the function so we can use it elsewhere
module.exports = isISOString;
この関数がどのように動作するかを見てみましょう。
new Date(val) は入力文字列から Date オブジェクトを作成します。d.valueOf() は数値のタイムスタンプ値(1970 年 1 月 1 日からのミリ秒数)を返します。Number.isNaN(d.valueOf()) は日付が無効であるかどうかをチェックします(NaN は「非数値」を意味します)。d.toISOString() === val は、Date オブジェクトを ISO 文字列に変換した結果が元の入力と一致することを検証します。では、関数を試すための簡単なテストファイルを作成しましょう。
testISO.js という名前の別のファイルを作成します。// Import our isISOString function
const isISOString = require("./isISODate");
// Test with a valid ISO formatted date
console.log("Testing a valid ISO date:");
console.log("2020-10-12T10:10:10.000Z");
console.log("Result:", isISOString("2020-10-12T10:10:10.000Z"));
console.log();
// Test with an invalid format
console.log("Testing a non-ISO date:");
console.log("2020-10-12");
console.log("Result:", isISOString("2020-10-12"));
node testISO.js
以下のような出力が表示されるはずです。
Testing a valid ISO date:
2020-10-12T10:10:10.000Z
Result: true
Testing a non-ISO date:
2020-10-12
Result: false
これは、私たちの関数が "2020-10-12T10:10:10.000Z" が有効な ISO 形式の日付であり、"2020-10-12" がそうでないことを正しく識別していることを示しています。
基本的な検証関数ができたので、様々な入力に対する動作を理解するために、異なる日付形式でテストしてみましょう。
様々な日付形式を調べるための包括的なテストスイートを作成しましょう。
dateTester.js という名前の新しいファイルを作成します。// Import our isISOString function
const isISOString = require("./isISODate");
// Function to test different date strings
function testDate(description, dateString) {
console.log(`Testing: ${description}`);
console.log(`Input: "${dateString}"`);
console.log(`Is ISO Format: ${isISOString(dateString)}`);
console.log("-----------------------");
}
// Valid ISO date examples
testDate("Standard ISO date with timezone Z", "2023-05-12T14:30:15.123Z");
testDate("ISO date with zero milliseconds", "2020-10-12T10:10:10.000Z");
// Invalid or non-ISO format examples
testDate("Date only (no time component)", "2023-05-12");
testDate("Date and time without milliseconds", "2023-05-12T14:30:15Z");
testDate(
"Date with time zone offset instead of Z",
"2023-05-12T14:30:15+01:00"
);
testDate("Invalid date (month 13 does not exist)", "2023-13-12T14:30:15.123Z");
testDate("Non-date string", "Hello World");
node dateTester.js
どの文字列が有効な ISO 日付で、どれが無効なのかを示す出力が表示されるはずです。
各テストケースが有効または無効になる理由を分析してみましょう。
2023-05-12T14:30:15.123Z - これは、UTC タイムゾーンの指示子 (Z) を含む完全な ISO 8601 形式に従っているため、有効です。
2020-10-12T10:10:10.000Z - ミリ秒が明示的に 000 に設定されているため、これも有効です。
2023-05-12 - これは有効な日付ですが、時間の部分が欠けているため、ISO 形式ではありません。
2023-05-12T14:30:15Z - これは ISO 形式のように見えますが、厳密な ISO 形式では必須のミリ秒が欠けています。
2023-05-12T14:30:15+01:00 - これは 'Z' の代わりにタイムゾーンのオフセット (+01:00) を使用しています。ISO 8601 では有効ですが、私たちの関数は toISOString() が生成する正確な形式(常に 'Z' を使用)を要求しています。
2023-13-12T14:30:15.123Z - これは無効な日付です(13 月は存在しません)。そのため、new Date() は無効な Date オブジェクトを作成します。
Hello World - これはまったく日付ではないため、new Date() は無効な Date オブジェクトを作成します。
私たちの検証関数は、具体的に 2 つの条件をチェックします。
このアプローチにより、JavaScript の toISOString() メソッドが生成する正確な ISO 形式を検証できます。
この最後のステップでは、isISOString 関数を改善してエッジケースを処理し、より堅牢なものにします。
実際のアプリケーションでデータを検証する際には、様々な予期しない入力を処理する必要があります。いくつかのエッジケースを見てみましょう。
これらのエッジケースを処理するように isISODate.js ファイルを更新しましょう。
isISODate.js ファイルを開きます。/**
* Checks if a string is a valid ISO 8601 formatted date string
* @param {string} val - The string to check
* @return {boolean} - Returns true if the string is in ISO format, false otherwise
*/
const isISOString = (val) => {
// Check if input is a string
if (typeof val !== "string") {
return false;
}
// Check if string is empty
if (val.trim() === "") {
return false;
}
try {
// Create a Date object from the input string
const d = new Date(val);
// Check if the date is valid and if the ISO string matches the original
return !Number.isNaN(d.valueOf()) && d.toISOString() === val;
} catch (error) {
// If any error occurs during validation, return false
return false;
}
};
// Export the function
module.exports = isISOString;
この改善された関数は、以下のことを行います。
エッジケースで改善された関数を検証するための最後のテストファイルを作成しましょう。
edgeCaseTester.js という名前の新しいファイルを作成します。// Import our improved isISOString function
const isISOString = require("./isISODate");
// Function to test and display results
function testCase(description, value) {
console.log(`Testing: ${description}`);
console.log(`Input: ${value === "" ? "(empty string)" : value}`);
console.log(`Type: ${typeof value}`);
console.log(`Is ISO Format: ${isISOString(value)}`);
console.log("-----------------------");
}
// Test with various edge cases
testCase("Valid ISO date", "2023-05-12T14:30:15.123Z");
testCase("Empty string", "");
testCase("Null value", null);
testDate("Undefined value", undefined);
testCase("Number value", 12345);
testCase("Object value", {});
testCase("Current date as ISO string", new Date().toISOString());
node edgeCaseTester.js
実際のアプリケーションでは、isISOString 関数は以下のようなシナリオで使用できます。
たとえば、フォーム検証関数では以下のように使用できます。
function validateForm(formData) {
// Other validations...
if (formData.startDate && !isISOString(formData.startDate)) {
return {
valid: false,
error: "Start date must be in ISO format"
};
}
// More validations...
return { valid: true };
}
改善された関数は、予期しない入力を処理し、ISO 形式の日付文字列に対する信頼性の高い検証を提供するのに十分な堅牢性を備えています。
この実験では、文字列が簡略化拡張 ISO 形式(ISO 8601)であるかどうかを検証する方法を学びました。以下はあなたが達成したことです。
このスキルは、API、データベース、または日付形式の一貫性が重要なシステムで作業する際に特に有用です。ISO 8601 形式は、曖昧さを排除し、日付と時刻を表す標準化された方法を提供するため、広く使用されています。
この実験からの重要なポイントは以下の通りです。
YYYY-MM-DDTHH:mm:ss.sssZ に従います。Date.prototype.toISOString() メソッドは常にこの形式で日付を出力します。これで、日付と時刻のデータを正しく処理する、より信頼性の高いアプリケーションを構築するためにこの知識を適用することができます。