Введение
В этом практическом занятии (лабораторной работе) мы рассмотрим, как определить, является ли заданная строка допустимой строкой даты в упрощенном расширенном формате ISO (ISO 8601). Мы будем использовать конструктор Date и связанные с ним методы для создания объекта Date из строки и проверки его корректности. По завершении практического занятия вы лучше поймете, как работать с датами в JavaScript и как проверять их корректность с использованием формата ISO.
Понимание формата дат ISO и объектов Date в JavaScript
Перед тем, как мы начнем писать код, давайте разберемся, что такое формат дат ISO 8601 и как JavaScript работает с датами.
Формат дат ISO 8601
Формат ISO 8601 представляет собой международный стандарт для представления дат и времени. Упрощенный расширенный формат ISO выглядит следующим образом:
YYYY-MM-DDTHH:mm:ss.sssZ
Где:
YYYYпредставляет год (четыре цифры)MMпредставляет месяц (две цифры)DDпредставляет день (две цифры)T- это литеральный символ, разделяющий дату и времяHHпредставляет часы (две цифры)mmпредставляет минуты (две цифры)ssпредставляет секунды (две цифры)sssпредставляет миллисекунды (три цифры)Zуказывает на часовой пояс UTC (Зульский час)
Например, 2023-05-12T14:30:15.123Z представляет 12 мая 2023 года, 14:30:15.123 по UTC.
Объект Date в JavaScript
JavaScript предоставляет встроенный объект Date для работы с датами и временем. Когда вы создаете новый объект Date, вы можете передать ему строку в формате ISO:
const date = new Date("2023-05-12T14:30:15.123Z");
Давайте откроем терминал и потренируемся работать с объектами Date:
- Откройте терминал, нажав на меню "Terminal" в верхней части WebIDE.
- Введите
nodeи нажмите Enter, чтобы запустить интерактивную оболочку Node.js. - Создайте новый объект Date для текущего времени:
const now = new Date();
console.log(now);

- Преобразуйте этот объект Date в строку в формате ISO:
const isoString = now.toISOString();
console.log(isoString);
Вы должны увидеть вывод, похожий на следующий:
2023-05-12T14:30:15.123Z
- Создайте объект Date из строки в формате ISO:
const dateFromIso = new Date("2023-05-12T14:30:15.123Z");
console.log(dateFromIso);

Это демонстрирует, как JavaScript может разбирать и создавать объекты Date из строк в формате ISO.
Создание функции для проверки строк дат в формате ISO
На этом этапе мы создадим функцию на JavaScript, которая будет проверять, является ли заданная строка допустимой строкой даты в формате ISO 8601.
Создание функции проверки
Давайте создадим новый файл JavaScript для нашего валидатора дат в формате ISO:
- В WebIDE нажмите на значок "Explorer" в левой боковой панели.
- Щелкните правой кнопкой мыши в проводнике файлов и выберите "New File".
- Назовите файл
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()возвращает числовое значение временной метки (миллисекунды с 1 января 1970 года).Number.isNaN(d.valueOf())проверяет, является ли дата недействительной (NaN означает "Not a Number").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.js:
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- Это допустимая дата, так как она соответствует полному формату ISO 8601 с индикатором часового пояса UTC (Z).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- Здесь используется смещение часового пояса (+01:00) вместо 'Z'. Хотя это допустимо по стандарту ISO 8601, наша функция требует точного формата, который возвращает методtoISOString(), и он всегда использует 'Z'.2023-13-12T14:30:15.123Z- Это недопустимая дата (месяц 13 не существует), поэтомуnew Date()создаст недопустимый объект Date.Hello World- Это вовсе не дата, поэтомуnew Date()создаст недопустимый объект Date.
Наша функция валидации специально проверяет два условия:
- Строка должна быть преобразована в допустимую дату (не NaN).
- Когда эта дата преобразуется обратно в строку в формате ISO, она должна точно совпадать с исходным входом.
Такой подход гарантирует, что мы валидируем точный формат ISO, который возвращает метод toISOString() в JavaScript.
Обработка крайних случаев и улучшение нашей функции
На этом последнем этапе мы улучшим нашу функцию isISOString, чтобы она могла обрабатывать крайние случаи и стала более надежной.
Общие крайние случаи
При валидации данных в реальных приложениях необходимо обрабатывать различные неожиданные входные данные. Давайте рассмотрим некоторые крайние случаи:
- Пустые строки
- Не-строковые значения (null, undefined, числа, объекты)
- Различные представления часовых поясов
Улучшение нашей функции
Давайте обновим файл isISODate.js, чтобы он мог обрабатывать эти крайние случаи:
- Откройте файл
isISODate.jsв WebIDE. - Замените существующий код на этот улучшенный вариант:
/**
* 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;
Теперь эта улучшенная функция:
- Проверяет, является ли входные данные строкой перед обработкой.
- Обрабатывает пустые строки.
- Использует блок try-catch для обработки любых ошибок, которые могут возникнуть.
- По-прежнему выполняет нашу основную логику валидации.
Тестирование нашей улучшенной функции
Давайте создадим один последний тестовый файл, чтобы проверить нашу улучшенную функцию на крайних случаях:
- Создайте новый файл с именем
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 может быть использована в таких сценариях, как:
- Валидация пользовательского ввода в поле даты.
- Проверка дат, полученных от внешних API.
- Гарантирование единообразного формата дат в базе данных.
- Валидация данных перед обработкой.
Например, в функции валидации формы:
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). Вот, что вы достигли:
- Узнали о формате дат ISO 8601 и его структуре.
- Поняли, как объекты Date в JavaScript работают со строками в формате ISO.
- Создали функцию для проверки, находится ли строка в точном формате ISO.
- Протестировали функцию с различными форматами дат.
- Улучшили функцию, чтобы она могла обрабатывать крайние случаи и стала более надежной.
Эта навык особенно полезен при работе с API, базами данных или любым системами, где важна единообразная форма представления дат. Формат ISO 8601 широко используется, так как он исключает неоднозначность и предоставляет стандартизованный способ представления дат и времени.
Основные выводы из этого практического занятия:
- Формат ISO 8601 следует определенному шаблону:
YYYY-MM-DDTHH:mm:ss.sssZ - Метод
Date.prototype.toISOString()в JavaScript всегда выводит даты в этом формате. - Валидация дат требует проверки как правильности, так и формата.
- Корректная обработка ошибок делает функции валидации более надежными.
Теперь вы можете применить эти знания для создания более надежных приложений, которые правильно обрабатывают данные о дате и времени.