Работа с формами, содержащими даты и время, требует строгого контроля над форматом входных данных. Пользовательский ввод почти всегда нестабилен: строки могут приходить в разных локалях, с разными разделителями, неполными значениями или ошибками.
Библиотека Day.js предоставляет компактный и предсказуемый инструмент для нормализации таких значений.
Основная задача при обработке ввода — преобразовать строку в валидный объект даты:
import dayjs from 'dayjs';
const input = '2026-05-23';
const date = dayjs(input);
console.log(date.isValid()); // true
При работе с формами важно не полагаться на автоматическое
распознавание формата. Day.js корректно интерпретирует только
ISO-форматы без дополнительной настройки. Для остальных случаев
используется строгий парсинг через plugin
customParseFormat.
Пользовательские формы часто принимают даты в виде
DD.MM.YYYY, MM/DD/YYYY или смешанных
вариантов. Без строгого режима такие строки могут интерпретироваться
неверно.
Подключение строгого парсинга:
import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);
Пример проверки ввода:
const input = '23.05.2026';
const date = dayjs(input, 'DD.MM.YYYY', true);
console.log(date.isValid()); // true
Флаг true включает строгий режим, при котором
несоответствие формату приводит к невалидной дате.
Формы часто допускают несколько допустимых форматов. Day.js позволяет передавать массив шаблонов:
const input = '05/23/2026';
const date = dayjs(input, ['DD.MM.YYYY', 'MM/DD/YYYY', 'YYYY-MM-DD'], true);
console.log(date.isValid());
Такой подход уменьшает необходимость предварительной нормализации строки.
Перед отправкой данных на сервер даты должны быть приведены к единому формату. Наиболее устойчивым считается ISO 8601.
const input = '23.05.2026';
const date = dayjs(input, 'DD.MM.YYYY', true);
const payload = {
createdAt: date.toISOString()
};
Метод toISOString() гарантирует единый формат независимо
от локали пользователя.
Пользовательские формы часто содержат неполные даты: только год, только месяц или комбинации без времени. Day.js позволяет собирать такие значения через последовательное уточнение.
const year = '2026';
const month = '05';
const day = '23';
const date = dayjs(`${year}-${month}-${day}`);
console.log(date.format('YYYY-MM-DD'));
При отсутствии компонентов важно контролировать валидность результата:
if (!date.isValid()) {
// обработка ошибки ввода
}
Нативные HTML-поля возвращают значения в стандартизированном формате.
<input type="date" id="dateInput">
const value = document.getElementById('dateInput').value;
const date = dayjs(value);
Для datetime-local формат включает локальное время без
временной зоны:
const value = '2026-05-23T14:30';
const date = dayjs(value);
При необходимости приведения к UTC используется плагин
utc.
Формы, собирающие время, часто приводят к ошибкам при передаче между клиентом и сервером из-за различий временных зон.
Подключение UTC-плагина:
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
Преобразование ввода:
const input = '2026-05-23T14:30';
const date = dayjs(input).utc();
console.log(date.format());
Такой подход устраняет неоднозначность локального времени.
Формы часто требуют ограничения: дата рождения, бронирование, сроки выполнения.
const input = '2026-05-23';
const date = dayjs(input);
const min = dayjs('2020-01-01');
const max = dayjs('2030-01-01');
const isValidRange = date.isAfter(min) && date.isBefore(max);
Диапазонная проверка должна выполняться после базовой валидации формата.
Неверный ввод необходимо обрабатывать без исключений. Day.js не выбрасывает ошибки, но возвращает невалидный объект.
const input = 'invalid-date';
const date = dayjs(input);
const safeDate = date.isValid()
? date.format('YYYY-MM-DD')
: null;
Fallback-значения позволяют избежать попадания некорректных данных в бизнес-логику.
После нормализации даты часто требуется вывод в пользовательском интерфейсе в локальном формате.
const input = '2026-05-23';
const date = dayjs(input);
const formatted = date.format('DD MMMM YYYY');
С локалями:
import 'dayjs/locale/ru';
dayjs.locale('ru');
const formatted = dayjs('2026-05-23').format('DD MMMM YYYY');
В некоторых интерфейсах ввод может быть задан относительно текущего времени: «через 3 дня», «2 недели назад».
Подключение relativeTime:
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);
Пример вычисления:
const date = dayjs('2026-05-25');
console.log(date.fromNow());
Такой вывод часто используется для подсказок в UI рядом с полями формы.
Раздельные поля формы (дата + время) требуют объединения значений:
const datePart = '2026-05-23';
const timePart = '14:30';
const dateTime = dayjs(`${datePart}T${timePart}`);
console.log(dateTime.format());
При изменении одного поля необходимо пересобирать итоговое значение, сохраняя целостность объекта даты.
Основные источники проблем:
Устойчивый шаблон обработки:
function parseFormDate(value) {
const date = dayjs(value, ['YYYY-MM-DD', 'DD.MM.YYYY'], true);
if (!date.isValid()) {
return null;
}
return date;
}
Такой подход централизует логику и упрощает поддержку форм.
В сложных формах часто требуется фиксированный формат, не совпадающий с отображением.
const input = '23.05.2026';
const date = dayjs(input, 'DD.MM.YYYY', true);
const businessFormat = date.format('YYYYMMDD');
Формат YYYYMMDD удобен для сортировки и хранения в
строковом виде.
При вводе времени с шагом (например, каждые 15 минут) важно нормализовать минуты:
const input = '14:37';
const date = dayjs(`2026-05-23T${input}`);
const roundedMinutes = Math.round(date.minute() / 15) * 15;
const normalized = date.minute(roundedMinutes).second(0);
Такая нормализация обеспечивает согласованность данных при сохранении.
Валидация обязательных дат:
const input = '';
const date = dayjs(input);
const isFilled = input.trim().length > 0 && date.isValid();
Разделение проверки строки и проверки даты снижает риск ложных срабатываний.
Перед отправкой данные должны быть приведены к стабильному контракту:
function preparePayload(form) {
const date = dayjs(form.date, 'YYYY-MM-DD', true);
return {
name: form.name,
date: date.isValid() ? date.toISOString() : null
};
}
Серверная сторона получает предсказуемый формат независимо от источника ввода.