Декоратор @IsISO8601 из библиотеки
class-validator предназначен для проверки строк на
соответствие формату даты и времени ISO 8601. Этот формат является
международным стандартом представления дат и широко используется в API,
базах данных, логах и протоколах обмена данными.
Основная задача валидатора — гарантировать, что строка представляет собой корректную дату/время в одном из допустимых вариантов ISO 8601, включая дату, дату со временем и временные зоны.
ISO 8601 допускает множество вариантов записи:
2024-01-252024-01-25T14:30:002024-01-25T14:30:00Z2024-01-25T14:30:00+03:002024-01-25T14:30:00.123ZПри этом валидатор @IsISO8601 ориентируется на строгую
проверку структуры строки, а не на преобразование в объект
Date. Это ключевой момент: корректность формата не всегда
означает корректность календарной даты в логическом смысле
JavaScript-движка.
import { IsISO8601 } from 'class-validator';
class EventDto {
@IsISO8601()
startDate: string;
}
В этом случае поле startDate должно содержать строку,
соответствующую стандарту ISO 8601. Любое отклонение от формата приведёт
к ошибке валидации.
Валидатор выполняет следующие проверки:
@IsOptional)Z, +hh:mm,
-hh:mm)Примеры валидных значений:
2024-01-01
2024-01-01T00:00:00Z
2024-01-01T00:00:00+00:00
2024-01-01T12:45:30.500Z
Примеры невалидных значений:
01-01-2024
2024/01/01
2024-1-1
2024-01-01 12:00:00
yesterday
strictДекоратор поддерживает параметр strict, который
усиливает проверку формата.
class TaskDto {
@IsISO8601({ strict: true })
deadline: string;
}
Пример различий:
| Значение | Без strict | С strict |
|---|---|---|
| 2024-01-01 | валидно | валидно |
| 20240101 | может пройти | невалидно |
| 2024-01-01T12:00 | валидно | невалидно (если отсутствуют секунды) |
ISO 8601 активно используется вместе с часовыми поясами:
class MeetingDto {
@IsISO8601()
scheduledAt: string;
}
Допустимые варианты:
2024-05-10T10:00:00Z2024-05-10T10:00:00+05:002024-05-10T10:00:00-02:30Особенности:
Z эквивалентен UTC+0Поддерживается расширенная точность времени:
2024-05-10T10:00:00.1Z
2024-05-10T10:00:00.123Z
2024-05-10T10:00:00.123456Z
Однако длина дробной части может зависеть от реализации парсера, используемого внутри библиотеки.
@IsISO8601 часто используется вместе с другими
валидаторами для формирования строгих DTO-моделей.
import { IsNotEmpty, IsISO8601 } from 'class-validator';
class ReportDto {
@IsNotEmpty()
@IsISO8601()
createdAt: string;
}
import { IsOptional, IsISO8601 } from 'class-validator';
class FilterDto {
@IsOptional()
@IsISO8601()
fromDate?: string;
}
В этом случае валидатор @IsISO8601 не срабатывает, если
поле отсутствует.
import { Type } from 'class-transformer';
import { ValidateNested, IsISO8601 } from 'class-validator';
class Period {
@IsISO8601()
start: string;
@IsISO8601()
end: string;
}
class ScheduleDto {
@ValidateNested()
@Type(() => Period)
period: Period;
}
Вложенные структуры требуют использования
@ValidateNested, иначе @IsISO8601 внутри не
будет применён.
class WrongDto {
@IsISO8601()
date: Date;
}
Проблема заключается в том, что Date автоматически
сериализуется в строку, но не всегда в ISO-формат. Это приводит к
непредсказуемым результатам.
Правильный подход:
class CorrectDto {
@IsISO8601()
date: string;
}
2024-01-01T10:00:00
Хотя строка может пройти валидацию, отсутствие временной зоны приводит к неоднозначности при интерпретации времени на сервере и клиенте.
2024.01.01T10:00:00Z
2024-01-01 10:00:00Z
Оба варианта не соответствуют ISO 8601 и будут отклонены.
При использовании class-transformer и
class-validator в связке важно учитывать порядок
преобразования:
plainToInstance)@Type)validate)Если строка даты приходит в виде числа или нестандартного формата,
@IsISO8601 не выполняет автоматическую конвертацию.
@IsISO8601 часто применяется в DTO слоях REST и GraphQL
API для обеспечения консистентности входных данных.
Типичный сценарий:
Это позволяет исключить неоднозначные форматы на границе системы.
В реальных проектах @IsISO8601 часто комбинируется с
другими проверками:
@MinDate, @MaxDate)start < endПример:
class RangeDto {
@IsISO8601()
start: string;
@IsISO8601()
end: string;
}
Дополнительная логика может проверять корректность интервала вне рамок самого декоратора.
Внутри библиотеки используется проверка строки через регулярное выражение, соответствующее ISO 8601, с учётом:
Важно учитывать, что это не полноценный парсер дат, а именно синтаксический валидатор.
ISO 8601 не зависит от локали, что делает его предпочтительным
форматом для серверных API. Валидация @IsISO8601 не
учитывает региональные настройки и всегда работает в рамках
стандарта.
Это исключает ситуации, когда дата интерпретируется по-разному в
зависимости от окружения (например, MM/DD/YYYY vs
DD/MM/YYYY).
При обработке больших массивов объектов валидатор
@IsISO8601 остаётся относительно лёгким по вычислительной
нагрузке, так как:
DateОднако при тысячах записей стоит учитывать общую стоимость всех декораторов вместе.
Несмотря на строгость, валидатор не решает следующие задачи:
Он предназначен исключительно для синтаксической проверки ISO 8601 строки.