Составные маски даты и времени в Inputmask строятся на объединении нескольких логических блоков: даты, времени и разделителей между ними. Основная задача таких масок — обеспечить строгий формат ввода, в котором пользователь не может нарушить структуру, но при этом ввод остаётся естественным и поэтапным.
Комбинированная маска обычно состоит из двух частей:
Между ними используется фиксированный разделитель, чаще всего пробел
или символ T в формате ISO.
Пример базовой конструкции:
Inputmask("datetime")
Однако в реальной практике стандартного пресета недостаточно, и применяется кастомная композиция:
Inputmask("99.99.9999 99:99")
Здесь:
99.99.9999 — дата99:99 — времяПри создании комбинированных масок важно учитывать, что каждый блок должен быть автономно валидируемым.
Наиболее распространённые варианты:
"dd.mm.yyyy"
"mm/dd/yyyy"
"yyyy-mm-dd"
В терминах Inputmask это выражается через маску:
"99.99.9999"
"99/99/9999"
"9999-99-99"
Ключевой момент: Inputmask не понимает семантику даты без дополнительных правил, поэтому он работает только с позицией символов.
Временные маски обычно строятся так:
"hh:mm"
"hh:mm:ss"
В Inputmask:
"99:99"
"99:99:99"
Для ограничения диапазонов используются дополнительные опции (например, валидаторы или onBeforePaste).
Самый простой способ комбинирования — конкатенация двух масок:
Inputmask("99.99.9999 99:99").mask(input);
Однако такой подход имеет ограничение: отсутствие контроля допустимых значений.
Inputmask предоставляет встроенный алиас datetime,
который уже содержит базовую логику:
Inputmask("datetime").mask(input);
Этот алиас поддерживает:
Расширенная настройка выполняется через объект:
Inputmask({
alias: "datetime",
inputFormat: "dd.mm.yyyy HH:MM"
}).mask(input);
Ключевые параметры:
inputFormat — задаёт структуруplaceholder — символы заполненияseparator — разделитель между компонентамиРазные регионы используют разные порядки:
dd.mm.yyyymm/dd/yyyyyyyy-mm-ddКомбинированные маски должны учитывать этот порядок:
Inputmask({
alias: "datetime",
inputFormat: "yyyy-mm-dd HH:MM:ss"
}).mask(input);
Разделитель между датой и временем — критический элемент. Он должен быть фиксированным, иначе маска теряет предсказуемость.
Примеры:
"99.99.9999 99:99"
"9999-99-99T99:99:99"
Второй вариант соответствует ISO 8601 и часто используется в API.
При комбинированных масках важно учитывать сценарий незавершённого ввода:
Для управления этим используется:
onBeforePaste: function (pastedValue) {
return pastedValue;
}
Или более строгая фильтрация:
onBeforePaste: function (value) {
return value.replace(/[^\d.: -]/g, "");
}
Сам Inputmask не является полноценным валидатором календаря, но позволяет частично ограничивать ввод.
Пример ограничения часов:
Inputmask({
alias: "datetime",
inputFormat: "dd.mm.yyyy HH:MM",
hourFormat: "24"
}).mask(input);
Для более строгих правил применяются внешние проверки:
function validateDateTime(value) {
const [date, time] = value.split(" ");
const [day, month, year] = date.split(".");
const [hour, minute] = time.split(":");
return (
day <= 31 &&
month <= 12 &&
hour < 24 &&
minute < 60
);
}
В некоторых интерфейсах требуется высокая точность времени:
"99.99.9999 99:99:99.999"
Конфигурация:
Inputmask({
alias: "datetime",
inputFormat: "dd.mm.yyyy HH:MM:ss.l"
}).mask(input);
Где:
l — миллисекундыДопускается использование текстовых вставок:
"99.99.9999 at 99:99"
Такой подход применяется в логах и административных интерфейсах:
Inputmask("99.99.9999 'at' 99:99").mask(input);
Ключевой момент — фиксированные литералы в маске.
Комбинированные маски часто ломаются при вставке строк вида:
2026-05-19 14:33:00
Для нормализации применяется постобработка:
onBeforePaste: function (value) {
return value.replace("T", " ");
}
Или более универсально:
onBeforePaste: function (value) {
return value.replace(/[TZ]/g, " ");
}
ISO-формат является наиболее устойчивым для комбинированных масок:
"yyyy-mm-dd'T'HH:MM:ss"
В Inputmask он задаётся напрямую:
Inputmask({
alias: "datetime",
inputFormat: "yyyy-mm-dd'T'HH:MM:ss"
}).mask(input);
Особенность:
T должен быть экранирован как литералПри переходе между блоками (дата → время) Inputmask управляет курсором автоматически:
Это особенно важно в длинных масках:
"99.99.9999 99:99:99"
На практике встречаются следующие проблемы:
Использование переменных разделителей → приводит к невозможности строгой маски
Отсутствие единого формата даты и времени → ломает парсинг на сервере
Смешивание локалей → mm.dd.yyyy и
dd.mm.yyyy в одном интерфейсе
Попытка заменить валидацию маской → Inputmask не заменяет бизнес-логику
В сложных интерфейсах комбинированные маски включают дополнительные элементы:
Пример:
"99.99.9999 99:99 GMT+99"
Реализация:
Inputmask("99.99.9999 99:99 'GMT+'99").mask(input);
Комбинированная маска даты и времени в Inputmask строится по принципу:
Такой подход обеспечивает стабильный ввод данных, совместимый с серверными форматами и API, при сохранении предсказуемого поведения интерфейса.