В библиотеке Pikaday ограничение выбора даты сверху реализуется через
параметр maxDate. Он определяет предельную дату, которую
пользователь может выбрать в календаре. Все даты, которые находятся
после указанной границы, становятся недоступными для взаимодействия в
интерфейсе календаря.
При инициализации календаря максимальная дата передаётся через объект
конфигурации. Значение должно быть экземпляром Date, а не
строкой или числом.
var picker = new Pikaday({
field: document.getElementById('datepicker'),
maxDate: new Date(2026, 11, 31)
});
В данном примере ограничение устанавливается на 31 декабря 2026 года.
Важно учитывать, что месяцы в JavaScript начинаются с нуля, поэтому
11 соответствует декабрю.
Pikaday не выполняет автоматический парсинг строк в даты в параметрах конфигурации. Это означает, что следующие варианты не являются корректными:
maxDate: '2026-12-31' // некорректно
Корректная форма всегда предполагает использование объекта:
maxDate: new Date(2026, 11, 31)
При необходимости преобразования строкового значения в дату следует
явно использовать конструктор Date или сторонние
инструменты форматирования до передачи значения в Pikaday.
После инициализации календаря ограничение можно изменять программно.
Для этого используется метод setMaxDate.
picker.setMaxDate(new Date(2027, 0, 15));
После вызова метода календарь автоматически пересчитывает доступные дни и обновляет интерфейс. Даты, выходящие за пределы нового диапазона, становятся недоступными для выбора.
Если пользователь уже выбрал дату, которая оказывается за пределами
нового maxDate, Pikaday не всегда автоматически сбрасывает
значение поля. Поэтому при динамическом изменении ограничения часто
требуется дополнительная проверка текущего значения.
var selectedDate = picker.getDate();
var max = new Date(2026, 5, 30);
picker.setMaxDate(max);
if (selectedDate && selectedDate > max) {
picker.setDate(null);
}
Такая логика предотвращает ситуации, когда в поле ввода остаётся недопустимое значение.
Ограничение сверху часто применяется вместе с нижней границей
minDate. Это позволяет задать допустимый диапазон
выбора.
var picker = new Pikaday({
field: document.getElementById('datepicker'),
minDate: new Date(2026, 0, 1),
maxDate: new Date(2026, 11, 31)
});
В результате календарь работает в рамках одного календарного года, полностью блокируя все даты вне диапазона.
При установке maxDate Pikaday изменяет визуальное
состояние календаря:
Такое поведение предотвращает возможность выбора недопустимых значений даже через переключение месяцев.
Частый сценарий — запрет выбора будущих дат. Для этого в качестве
maxDate используется текущий день.
var today = new Date();
var picker = new Pikaday({
field: document.getElementById('datepicker'),
maxDate: today
});
При этом важно учитывать, что объект Date содержит и
время. Pikaday ориентируется на дату без учёта времени, но при сравнении
значений в пользовательской логике это может иметь значение.
Для корректного поведения часто применяется нормализация даты до полуночи:
function normalizeDate(d) {
return new Date(d.getFullYear(), d.getMonth(), d.getDate());
}
var max = normalizeDate(new Date());
Такое приведение позволяет избежать ситуаций, когда сравнение дат с временной составляющей приводит к неожиданным результатам в пользовательской логике.
В динамических интерфейсах ограничение может зависеть от других полей формы. Например, выбор минимальной даты в одном календаре влияет на максимальную в другом.
var startPicker = new Pikaday({
field: document.getElementById('start'),
onSelect: function() {
var startDate = this.getDate();
endPicker.setMinDate(startDate);
}
});
var endPicker = new Pikaday({
field: document.getElementById('end')
});
В этом случае maxDate может вычисляться дополнительно,
например, на основе бизнес-логики:
endPicker.setMaxDate(new Date(2026, 11, 31));
Иногда максимальная дата рассчитывается относительно текущей:
var today = new Date();
var nextYearLimit = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());
var picker = new Pikaday({
field: document.getElementById('datepicker'),
maxDate: nextYearLimit
});
Такой подход используется в системах бронирования и планирования, где требуется ограничение «на год вперёд».
Хотя maxDate влияет на логику выбора, отображение даты
зависит от настроек форматирования Pikaday. При этом сама граница не
изменяется в зависимости от локали, но восприятие пользователем может
отличаться из-за формата отображения.
Типичные проблемы возникают при неправильной передаче значения:
DatemaxDate раньше уже выбранной даты
без очистки значенияКорректная работа всегда требует явного контроля типов и последовательности обновлений.
Для снятия ограничения используется установка null:
picker.setMaxDate(null);
После этого календарь перестаёт блокировать верхнюю границу, и пользователь получает доступ ко всем будущим датам.
В сложных интерфейсах maxDate часто управляется вместе с
другими параметрами Pikaday:
setMinDatesetDategotoDateПример синхронизации состояния:
picker.setMinDate(new Date(2026, 0, 1));
picker.setMaxDate(new Date(2026, 11, 31));
picker.gotoDate(new Date(2026, 5, 1));
Такое управление позволяет полностью контролировать отображаемый диапазон и текущую позицию календаря.
Если одновременно заданы minDate и maxDate,
которые пересекаются некорректно (например, minDate больше
maxDate), Pikaday может вести себя непредсказуемо:
календарь становится пустым или блокирует все даты. Поэтому логика
установки ограничений всегда должна гарантировать корректный
диапазон:
if (minDate <= maxDate) {
picker.setMinDate(minDate);
picker.setMaxDate(maxDate);
}