Проверка строки на соответствие формату даты ISO

JavaScriptJavaScriptBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) мы рассмотрим, как определить, является ли заданная строка допустимой строкой даты в упрощенном расширенном формате ISO (ISO 8601). Мы будем использовать конструктор Date и связанные с ним методы для создания объекта Date из строки и проверки его корректности. По завершении практического занятия вы лучше поймете, как работать с датами в JavaScript и как проверять их корректность с использованием формата ISO.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("JavaScript")) -.-> javascript/BasicConceptsGroup(["Basic Concepts"]) javascript(("JavaScript")) -.-> javascript/AdvancedConceptsGroup(["Advanced Concepts"]) javascript/BasicConceptsGroup -.-> javascript/data_types("Data Types") javascript/BasicConceptsGroup -.-> javascript/cond_stmts("Conditional Statements") javascript/BasicConceptsGroup -.-> javascript/functions("Functions") javascript/AdvancedConceptsGroup -.-> javascript/error_handle("Error Handling") subgraph Lab Skills javascript/data_types -.-> lab-28422{{"Проверка строки на соответствие формату даты ISO"}} javascript/cond_stmts -.-> lab-28422{{"Проверка строки на соответствие формату даты ISO"}} javascript/functions -.-> lab-28422{{"Проверка строки на соответствие формату даты ISO"}} javascript/error_handle -.-> lab-28422{{"Проверка строки на соответствие формату даты ISO"}} end

Понимание формата дат 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:

  1. Откройте терминал, нажав на меню "Terminal" в верхней части WebIDE.
  2. Введите node и нажмите Enter, чтобы запустить интерактивную оболочку Node.js.
  3. Создайте новый объект Date для текущего времени:
const now = new Date();
console.log(now);
node-prompt
  1. Преобразуйте этот объект Date в строку в формате ISO:
const isoString = now.toISOString();
console.log(isoString);

Вы должны увидеть вывод, похожий на следующий:

2023-05-12T14:30:15.123Z
  1. Создайте объект Date из строки в формате ISO:
const dateFromIso = new Date("2023-05-12T14:30:15.123Z");
console.log(dateFromIso);
node-prompt

Это демонстрирует, как JavaScript может разбирать и создавать объекты Date из строк в формате ISO.

Создание функции для проверки строк дат в формате ISO

На этом этапе мы создадим функцию на JavaScript, которая будет проверять, является ли заданная строка допустимой строкой даты в формате ISO 8601.

Создание функции проверки

Давайте создадим новый файл JavaScript для нашего валидатора дат в формате ISO:

  1. В WebIDE нажмите на значок "Explorer" в левой боковой панели.
  2. Щелкните правой кнопкой мыши в проводнике файлов и выберите "New File".
  3. Назовите файл isISODate.js и нажмите Enter.
  4. Добавьте следующий код в файл:
/**
 * 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;

Давайте разберем, как работает эта функция:

  1. new Date(val) создает объект Date из входной строки.
  2. d.valueOf() возвращает числовое значение временной метки (миллисекунды с 1 января 1970 года).
  3. Number.isNaN(d.valueOf()) проверяет, является ли дата недействительной (NaN означает "Not a Number").
  4. d.toISOString() === val проверяет, что преобразование объекта Date обратно в строку в формате ISO совпадает с исходным входом.

Тестирование нашей функции

Теперь давайте создадим простой тестовый файл, чтобы проверить нашу функцию:

  1. Создайте еще один файл с именем testISO.js.
  2. Добавьте следующий код:
// 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"));
  1. Запустите тестовый файл с помощью 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" - нет.

Тестирование с различными форматами дат

Теперь, когда у нас есть базовая функция валидации, давайте протестируем ее с разными форматами дат, чтобы понять, как она ведет себя при различных входных данных.

Создание набора тестов

Давайте создадим комплексный набор тестов для проверки различных форматов дат:

  1. Создайте новый файл с именем dateTester.js.
  2. Добавьте следующий код:
// 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");
  1. Запустите набор тестов в терминале:
node dateTester.js

Вы должны увидеть вывод, показывающий, какие строки являются допустимыми датами в формате ISO, а какие - нет.

Понимание результатов

Давайте проанализируем, что делает каждый тестовый случай допустимым или недопустимым:

  1. 2023-05-12T14:30:15.123Z - Это допустимая дата, так как она соответствует полному формату ISO 8601 с индикатором часового пояса UTC (Z).

  2. 2020-10-12T10:10:10.000Z - Это также допустимая дата, с явно заданными миллисекундами, равными 000.

  3. 2023-05-12 - Это допустимая дата, но не в формате ISO, так как отсутствует компонент времени.

  4. 2023-05-12T14:30:15Z - Эта строка, казалось бы, имеет формат ISO, но отсутствуют миллисекунды, которые обязательны в строгом формате ISO.

  5. 2023-05-12T14:30:15+01:00 - Здесь используется смещение часового пояса (+01:00) вместо 'Z'. Хотя это допустимо по стандарту ISO 8601, наша функция требует точного формата, который возвращает метод toISOString(), и он всегда использует 'Z'.

  6. 2023-13-12T14:30:15.123Z - Это недопустимая дата (месяц 13 не существует), поэтому new Date() создаст недопустимый объект Date.

  7. Hello World - Это вовсе не дата, поэтому new Date() создаст недопустимый объект Date.

Наша функция валидации специально проверяет два условия:

  1. Строка должна быть преобразована в допустимую дату (не NaN).
  2. Когда эта дата преобразуется обратно в строку в формате ISO, она должна точно совпадать с исходным входом.

Такой подход гарантирует, что мы валидируем точный формат ISO, который возвращает метод toISOString() в JavaScript.

Обработка крайних случаев и улучшение нашей функции

На этом последнем этапе мы улучшим нашу функцию isISOString, чтобы она могла обрабатывать крайние случаи и стала более надежной.

Общие крайние случаи

При валидации данных в реальных приложениях необходимо обрабатывать различные неожиданные входные данные. Давайте рассмотрим некоторые крайние случаи:

  1. Пустые строки
  2. Не-строковые значения (null, undefined, числа, объекты)
  3. Различные представления часовых поясов

Улучшение нашей функции

Давайте обновим файл isISODate.js, чтобы он мог обрабатывать эти крайние случаи:

  1. Откройте файл isISODate.js в WebIDE.
  2. Замените существующий код на этот улучшенный вариант:
/**
 * 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;

Теперь эта улучшенная функция:

  1. Проверяет, является ли входные данные строкой перед обработкой.
  2. Обрабатывает пустые строки.
  3. Использует блок try-catch для обработки любых ошибок, которые могут возникнуть.
  4. По-прежнему выполняет нашу основную логику валидации.

Тестирование нашей улучшенной функции

Давайте создадим один последний тестовый файл, чтобы проверить нашу улучшенную функцию на крайних случаях:

  1. Создайте новый файл с именем edgeCaseTester.js.
  2. Добавьте следующий код:
// 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());
  1. Запустите тестовый файл:
node edgeCaseTester.js

Применение в реальном мире

В реальном приложении наша функция isISOString может быть использована в таких сценариях, как:

  1. Валидация пользовательского ввода в поле даты.
  2. Проверка дат, полученных от внешних API.
  3. Гарантирование единообразного формата дат в базе данных.
  4. Валидация данных перед обработкой.

Например, в функции валидации формы:

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). Вот, что вы достигли:

  1. Узнали о формате дат ISO 8601 и его структуре.
  2. Поняли, как объекты Date в JavaScript работают со строками в формате ISO.
  3. Создали функцию для проверки, находится ли строка в точном формате ISO.
  4. Протестировали функцию с различными форматами дат.
  5. Улучшили функцию, чтобы она могла обрабатывать крайние случаи и стала более надежной.

Эта навык особенно полезен при работе с API, базами данных или любым системами, где важна единообразная форма представления дат. Формат ISO 8601 широко используется, так как он исключает неоднозначность и предоставляет стандартизованный способ представления дат и времени.

Основные выводы из этого практического занятия:

  • Формат ISO 8601 следует определенному шаблону: YYYY-MM-DDTHH:mm:ss.sssZ
  • Метод Date.prototype.toISOString() в JavaScript всегда выводит даты в этом формате.
  • Валидация дат требует проверки как правильности, так и формата.
  • Корректная обработка ошибок делает функции валидации более надежными.

Теперь вы можете применить эти знания для создания более надежных приложений, которые правильно обрабатывают данные о дате и времени.