Диапазоны допустимых дат

Работа с датами в Inputmask строится вокруг поведения алиаса datetime, который позволяет задавать формат ввода и контролировать допустимые значения. Ограничение диапазона дат используется для предотвращения ввода значений вне бизнес-логики приложения: будущих дат там, где они недопустимы, или слишком старых дат в системах учёта.

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


Базовая конфигурация маски даты

Основой служит алиас datetime, который определяет формат и правила ввода:

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy"
}).mask("#date");

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


Ограничение минимальной и максимальной даты

Для задания допустимого диапазона используются параметры min и max. Они определяют нижнюю и верхнюю границу допустимых значений.

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  min: "01.01.2000",
  max: "31.12.2030"
}).mask("#date");

В этом случае:

  • любые даты ранее 2000 года считаются недопустимыми;
  • любые даты позже 2030 года блокируются;
  • ввод внутри диапазона разрешён.

Поведение при вводе вне диапазона

Inputmask не всегда запрещает ввод символов мгновенно. Вместо этого используется комбинация механизмов:

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

Например, при max: 31.12.2030:

  • год 2031 не будет принят;
  • в декабре 2030 ограничивается корректность дня;
  • при вводе месяца могут блокироваться значения, которые делают итоговую дату невозможной.

Влияние формата даты на диапазон

Формат inputFormat влияет на интерпретацию min и max. Одна и та же дата может быть интерпретирована по-разному в зависимости от порядка компонентов.

Пример формата dd.mm.yyyy

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  min: "01.02.2020",
  max: "31.10.2025"
}).mask("#date");

Пример формата mm/dd/yyyy

Inputmask({
  alias: "datetime",
  inputFormat: "mm/dd/yyyy",
  min: "02/01/2020",
  max: "10/31/2025"
}).mask("#date");

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


Работа с объектами Date

В более строгих конфигурациях допускается использование объектов Date вместо строк. Это снижает риск ошибок интерпретации формата.

Inputmask({
  alias: "datetime",
  inputFormat: "yyyy-mm-dd",
  min: new Date(2020, 0, 1),
  max: new Date(2030, 11, 31)
}).mask("#date");

Особенность JavaScript Date:

  • месяцы индексируются с нуля;
  • локальное время может влиять на отображение;
  • при сериализации возможны сдвиги при UTC/локальном времени.

Частичное ограничение диапазона

В некоторых сценариях требуется ограничить только одну границу:

Только минимальная дата

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  min: "01.01.2020"
}).mask("#date");

Только максимальная дата

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  max: "31.12.2025"
}).mask("#date");

Отсутствие одной из границ означает отсутствие соответствующего ограничения, и Inputmask допускает ввод в бесконечную сторону диапазона.


Ограничение диапазона по частям даты

Внутренняя логика Inputmask учитывает структуру даты и может ограничивать ввод на уровне отдельных сегментов:

  • день ограничивается диапазоном 1–31 (с учётом месяца);
  • месяц — 1–12;
  • год — в пределах min/max.

При наличии min и max диапазоны становятся динамическими.

Например:

min: "15.03.2022",
max: "10.06.2022"

В этом случае:

  • март ограничивается днями от 15;
  • июнь ограничивается днями до 10;
  • апрель и май полностью допустимы;
  • январь и февраль недоступны.

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

При вставке строки Inputmask выполняет полную проверку:

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  min: "01.01.2020",
  max: "31.12.2030"
}).mask("#date");

Если вставляется значение:

15.07.2035

то возможны сценарии:

  • значение отклоняется целиком;
  • часть значения очищается или корректируется (в зависимости от конфигурации);
  • поле помечается как незавершённое.

Поведение зависит от настроек обработки вставки и версии Inputmask.


Влияние yearrange на диапазоны

Параметр yearrange ограничивает не сами значения, а поведение выбора года в процессе ввода:

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  yearrange: { minyear: 1990, maxyear: 2030 }
}).mask("#date");

Отличие:

  • min/max — строгая валидация значений;
  • yearrange — ограничение допустимого диапазона годов при вводе.

Сочетание диапазона с автокоррекцией

Inputmask способен автоматически корректировать ввод в пределах допустимого диапазона:

Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  min: "01.01.2020",
  max: "31.12.2030",
  autoUnmask: true
}).mask("#date");

При вводе некорректных значений поведение может включать:

  • подстановку ближайшей допустимой даты;
  • блокировку изменения части значения;
  • сброс поля при потере фокуса.

Зависимость диапазона от локали и формата

При использовании локализованных форматов важно учитывать:

  • порядок компонентов даты;
  • разделители (., /, -);
  • различие между европейским и американским стилем.

Ошибочное сочетание приводит к тому, что диапазон применяется к неверным частям строки, что визуально выглядит как «сломанная» валидация.


Типичные ошибки конфигурации диапазона

Неправильная настройка чаще всего связана с:

  • несоответствием формата и строк min/max;
  • использованием строк без учёта формата inputFormat;
  • смешением локальных и UTC дат;
  • заданием диапазона, где min > max.

Пример некорректной конфигурации:

min: "31.12.2030",
max: "01.01.2020"

В таких случаях поведение становится неопределённым: Inputmask может игнорировать ограничения или частично их применять.


Диапазоны и незавершённый ввод

Во время ввода значение часто является неполным:

12.0_.____

Inputmask оценивает диапазон только тогда, когда:

  • заполнены все обязательные сегменты;
  • строка может быть интерпретирована как дата.

До этого момента проверка носит прогнозный характер, ограничивая только невозможные комбинации.


Особенности обработки крайних дат

Крайние значения диапазона обрабатываются как допустимые при полном совпадении:

  • дата, равная min, разрешена;
  • дата, равная max, разрешена;
  • отклонение даже на один день делает значение недопустимым.

Это важно учитывать при бизнес-логике, связанной с включающими интервалами (inclusive ranges).


Поведение при динамическом изменении диапазона

Диапазон может изменяться во время работы страницы:

let im = Inputmask({
  alias: "datetime",
  inputFormat: "dd.mm.yyyy",
  min: "01.01.2020",
  max: "31.12.2025"
}).mask("#date");

// позже
im.option({
  min: "01.01.2022",
  max: "31.12.2030"
});

При обновлении:

  • текущее значение перепроверяется;
  • невалидные даты могут быть очищены;
  • поведение ввода перестраивается под новый диапазон.