В библиотеке Pikaday форматирование даты основано на строковых шаблонах, состоящих из специальных токенов. Эти токены определяют, как именно будет представлена дата в инпуте, при выводе пользователю, а также при программной обработке значения. Механизм форматирования тесно связан с принципами, знакомыми по библиотекам вроде Moment.js, однако в Pikaday он реализован в упрощённом и автономном виде, достаточном для задач datepicker-компонента.
Формат даты задаётся строкой, где каждый токен отвечает за отдельный компонент даты:
Пример базового формата:
new Pikaday({
field: document.getElementById('date'),
format: 'DD.MM.YYYY'
});
В данном случае строка DD.MM.YYYY интерпретируется
как:
DD — день месяца с ведущим нулёмMM — месяц с ведущим нулёмYYYY — четырёхзначный годРезультат: 05.01.2026
DДень месяца без ведущего нуля.
Примеры:
DDДень месяца с ведущим нулём.
Примеры:
Используется в большинстве пользовательских интерфейсов, где требуется фиксированная ширина поля.
MМесяц без ведущего нуля.
Примеры:
MMМесяц с ведущим нулём.
Примеры:
MMMСокращённое текстовое название месяца.
Примеры:
Локализация зависит от настроек i18n, где можно задать
собственные значения сокращений.
MMMMПолное название месяца.
Примеры:
YYДвузначный формат года.
Примеры:
YYYYЧетырёхзначный формат года.
Примеры:
Четырёхзначный формат предпочтителен в прикладных системах, где важно избежать неоднозначности.
D (в контексте недели)В некоторых реализациях форматирования Pikaday используется обозначение дня недели через числовое значение, однако чаще для этого применяются текстовые токены:
ddСокращённое название дня недели.
Примеры:
dddБолее расширенное сокращение.
Примеры:
ddddПолное название дня недели.
Примеры:
Локализация этих значений задаётся через параметр
i18n:
new Pikaday({
field: document.getElementById('date'),
i18n: {
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
months: ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December']
}
});
Форматирование не ограничивается только токенами. Любые символы, не распознанные как токены, воспринимаются как литералы и выводятся без изменений.
Примеры:
format: 'DD.MM.YYYY'
Результат:
05.01.2026
format: 'DD/MM/YYYY'
Результат:
05/01/2026
format: 'DD [day of] MMMM YYYY'
Результат:
05 day of January 2026
Квадратные скобки часто используются для явного указания литерального текста, который не должен интерпретироваться как токены. Это особенно важно при сложных форматах.
При обработке строки форматирования Pikaday использует последовательный разбор слева направо. Токены распознаются по максимальному совпадению длины.
Например:
MMMM будет обработан раньше, чем MM или
MDD имеет приоритет над DЭто предотвращает неоднозначность при разборе строки:
format: 'D MMMM'
Здесь:
D — день без нуляMMMM — полное название месяцаPikaday позволяет задавать формат динамически, что важно для адаптивных интерфейсов и мультиязычных приложений.
const picker = new Pikaday({
field: document.getElementById('date'),
format: 'DD.MM.YYYY'
});
// изменение формата в рантайме
picker.config.format = 'YYYY-MM-DD';
После изменения формата отображение значения в input будет автоматически адаптировано при следующем выборе даты.
Формат токенов используется не только для отображения, но и для
обратного преобразования строки в объект Date.
При вводе значения вручную Pikaday пытается сопоставить строку с заданным форматом:
new Pikaday({
field: document.getElementById('date'),
format: 'DD.MM.YYYY'
});
Если пользователь вводит:
05.01.2026
библиотека разбивает строку по шаблону:
05 → день01 → месяц2026 → годИ формирует объект:
new Date(2026, 0, 5)
Если формат не совпадает, результат может быть
Invalid Date.
Токены не поддерживают вычисления или преобразования. Нельзя использовать конструкции вида:
DD+1.MM.YYYY
Форматирование строго декларативно.
Токены регистрозависимы:
MM — месяцmm — не является валидным токеном месяца и может быть
проигнорирован или интерпретирован как литералЭто особенно важно при использовании пользовательских шаблонов, где ошибка в регистре приводит к некорректному отображению.
В отличие от более тяжёлых решений, Pikaday не предоставляет полноценной системы кастомных токенов. Расширение возможно только через:
Токены, связанные с текстовыми значениями (месяцы, дни недели),
напрямую зависят от объекта i18n. Это означает, что один и
тот же формат может давать разные результаты в зависимости от языка
интерфейса.
Пример:
format: 'DD MMMM YYYY'
05 January 202605 Январь 2026Таким образом, формат и локализация работают совместно, но независимо друг от друга: формат определяет структуру, локализация — содержимое текстовых элементов.
В реальных интерфейсах часто используются составные форматы:
format: 'dddd, DD MMMM YYYY'
Результат:
Monday, 05 January 2026
Или более прикладной вариант:
format: '[Date:] DD.MM.YYYY [Time slot selected]'
Результат:
Date: 05.01.2026 Time slot selected
Подобные конструкции используются для формирования человекочитаемых строк без необходимости дополнительной логики форматирования.
Если строка содержит неизвестные последовательности символов, Pikaday трактует их как литералы.
Пример:
format: 'DD.QQ.YYYY'
Результат:
05.QQ.2026
Это поведение позволяет безопасно использовать пользовательские строки без риска поломки форматирования, но требует внимательности при проектировании шаблонов.
Процесс обработки формата можно представить как последовательность шагов:
Такая модель делает систему предсказуемой и устойчивой к ошибкам, но ограничивает гибкость по сравнению с полноценными шаблонизаторами.