Тот факт, что дата записана в схеме JSON, не означает, что валидатор должен проверять дату.

В схеме указано `format: date`, но неверная дата проходит проверку. Это не обязательно означает, что в библиотеке есть ошибка. Способ обработки `format` зависит от конфигурации валидатора. Когда вы получите сообщение об успешной проверке, сначала спросите, проверен ли тип, структура или семантика даты.

Основные положения этой статьи

— Формат: дата, записанный в Схеме, не означает, что валидатор обязательно проверит семантику даты.

  • Draft202012Validator по умолчанию выполняет только проверку структуры и не отклоняет несуществующие даты, такие как 30 февраля 2026 г.
  • Для последовательности месяца и дня 04.03.2026 требуется исходный регион, описание поля или четкое подтверждение протокола. Проверка даты не может доказать правильность выбора месяца.
  • Тестирование должно включать разрешенные високосные дни, незаконные високосные дни и неверные значения и проверяться по одному в закрытой среде.

format: date записан в схеме JSON, но проверку проходит несуществующая дата. Обычно это не ошибка в библиотеке. Способ обработки format зависит от конфигурации валидатора. Когда вы получаете результат «проверка успешна», вам следует сначала подтвердить, проверяется ли он тип, структура или также проверяется семантика даты.

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

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

Что именно проверяет проверка даты в JSON Schema? Вывод в одно предложение

Сначала проверьте, включена ли в валидаторе проверка format, а затем подтвердите, отвечают ли за это семантические правила даты (существует ли она на самом деле и как ее интерпретировать).

твоя ситуацияРекомендуемые практикипричина
Проверяйте format: date только с помощью валидатора по умолчанию.Сначала убедитесь, что FormatChecker явно включен.Способ обработки format зависит от конфигурации валидатора.
Необходимо определить такие даты, как 2026-02-30.Поместите его в тестовый набор в качестве контрпримера.Строка выглядит как дата, но это не означает, что она существует в календаре.
Порядок дня и месяца исходной даты неизвестен.Отмечайте двусмысленность, никаких автоматических догадокПрохождение проверки date может показать только то, что преобразованное значение действительно.
Поля со временем и часовым поясомИспользуйте независимые протоколы времениПервые десять символов не следует случайно перехватывать и обрабатывать.
Используется для проверки даты перевода.Сохраните как raw_text, так и нормализованные значения.Рецензентам необходимо видеть как оригинальное содержание, так и систематическое объяснение.

Две, казалось бы, одинаковые проверки

2026-02-30 представляет собой строку и выглядит как дата, но в феврале нет 30-го дня. Только проверка правильных фигур позволит пропустить такую проблему. Ниже используется Python jsonschema для сравнения результатов валидатора по умолчанию и явного включения FormatChecker.

Протестируйте конфигурацию с невозможной датой

from jsonschema import Draft202012Validator, FormatChecker

schema = {"type": "string", "format": "date"}
structural = Draft202012Validator(schema)
strict = Draft202012Validator(schema, format_checker=FormatChecker())

def valid(v, value):
    return not list(v.iter_errors(value))

assert valid(structural, "2026-02-30")
assert not valid(strict, "2026-02-30")
assert valid(strict, "2024-02-29")
assert not valid(strict, "2025-02-29")
assert not valid(strict, "26/09/2026")
assert not valid(strict, 20260926)

Синтетический пример проверяет только date. Другие форматы могут иметь дополнительные зависимости или различия в реализации, и их следует тестировать в каждом конкретном случае в закрытой среде. Неизвестные имена форматов не могут означать, что была реализована какая-то проверка, а орфографические ошибки могут дать вам ощущение бессмысленной безопасности.

Формат даты не является правилом интерпретации даты

03/04/2026 в источнике может означать 4 марта, а может и 3 апреля. Перед преобразованием в форму ISO требуются исходный регион, спецификация поля или явный протокол. Прохождение проверки date может только доказать, что преобразованное значение действительно, но не может доказать, что вы выбрали правильный месяц.

Исходная информациячто делатьЧего не делать
Календарная дата, которой не существуетСообщить об ошибке и просмотреть источникАвтоматически переходить к следующему месяцу
Неизвестный порядок Солнца и ЛуныНеоднозначность тегаУгадайте на основе языка сервера
Со временем и часовым поясомИспользуйте независимые протоколы времениСлучайным образом перехватить первые десять символов
Поле пустоОтноситесь к отсутствующим правиламДополните сегодняшнюю дату

Включение конфигурации в регрессионное тестирование

Поместите в тестовый набор как минимум три типа значений: допустимый високосный день, недопустимый високосный день и искаженное значение. Запуск этих противоположных примеров при развертывании более эффективен, чем просто проверка существования файла схемы. Если служба реализована на разных языках, один и тот же набор тестов следует проверять отдельно и не предполагать, что поведение двух валидаторов по умолчанию одинаково.

При проверке перевода сохраняется исходная дата

При использовании результатов извлечения даты для проверки перевода OmniDoc рекомендуется сохранять как raw_text, так и нормализованные значения. Рецензенту необходимо увидеть, «что представляет собой исходный контент» и «как его интерпретирует система», чтобы определить, заключается ли разница в переводе, извлечении или преобразовании формата.

Источники: Строка и формат схемы JSON.

📊 Сравнение ядра

Сравнительный элементВалидатор по умолчаниюЯвно включить FormatChecker
Проверить объемТипы и конструкцииДополнительная проверка формата декларацииformat
Заключение по 2026-02-30Не предполагайте отказНеобходимо подтвердить контрпримерами.
имеется в виду при прохожденииЭто не означает, что семантика даты верна.Все еще нужно проверить объяснение даты в бизнесе.

🎯 Какой метод подходит вам?

Если вам просто нужно убедиться, что поле является строкой или правильно структурировано

Валидатора по умолчанию обычно достаточно, но имейте в виду, что он не обязательно проверяет семантику даты.

Если вам нужно подтвердить, что дата действительно существует

Явно включите FormatChecker и проверьте противоположные примеры, такие как 2026-02-30.

Если вы хотите проверить дату в исходном файле

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

Если ваш сервис развернут на разных языках

Для каждой реализации выполняется один и тот же набор тестов.

❓ Часто задаваемые вопросы (FAQ)

1. Схема написана как format: date, почему плохие даты все равно могут пройти?

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

2. Почему 2026-02-30 является полезным тестовым значением?

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

3. Что произойдет, если будет использовано неизвестное имя формата?

Не следует относиться к нему так, как будто он был проверен, поскольку орфографические ошибки могут дать вам ложное чувство безопасности.

4. Как конвертировать 03/04/2026?

Требуется регион происхождения, описание поля или явный протокол. В противном случае было бы невозможно определить, соответствует ли это 4 марта или 3 апреля.

📝 Резюме

Прохождение проверки означает лишь то, что данные соответствуют заявленным правилам, но не означает, что значение каждой даты верно. Сначала подтвердите область проверки валидатора, а затем используйте контрпримеры и исходные правила, чтобы исправить обработку даты, чтобы результаты были более надежными.

Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.

Обновлено 2026-11-13