В режиме множественного выбора библиотека Flatpickr сохраняет даты в
массиве selectedDates. Важно учитывать, что порядок
элементов в этом массиве зависит не от хронологии, а от
последовательности кликов пользователя.
const fp = flatpickr("#input", {
mode: "multiple"
});
При выборе дат, например:
в selectedDates они будут храниться именно в таком
порядке выбора, а не в отсортированном виде по календарю.
Это поведение часто становится источником логических ошибок при последующей обработке данных.
Flatpickr ориентируется на UX-поведение: пользовательский порядок выбора может иметь смысл в сценариях:
Поэтому библиотека сознательно не вмешивается в порядок массива.
Внутренне selectedDates — это обычный массив объектов
Date, который не проходит автоматическую сортировку.
Для приведения выбранных дат к хронологическому порядку применяется стандартная сортировка Jav * aScript:
const sorted = fp.selectedDates.slice().sort((a, b) => a - b);
Ключевой момент:
a и b — объекты DateТакой подход корректен и быстрый, так как Date при
математических операциях автоматически приводится к timestamp.
На практике сортировку выполняют внутри обработчика
onChange:
const fp = flatpickr("#input", {
mode: "multiple",
onChange: function(selectedDates, dateStr, instance) {
const sorted = selectedDates.slice().sort((a, b) => a - b);
console.log(sorted);
}
});
Здесь важно использовать slice(), чтобы не мутировать
оригинальный массив, который использует сам Flatpickr.
Flatpickr предоставляет строковое представление через
dateStr, но оно всегда соответствует внутреннему порядку
выбора, а не сортировке.
Для получения отсортированной строки необходимо самостоятельно форматировать даты:
const fp = flatpickr("#input", {
mode: "multiple",
dateFormat: "Y-m-d",
onChange: function(selectedDates) {
const sorted = selectedDates
.slice()
.sort((a, b) => a - b);
const formatted = sorted.map(d =>
fp.formatDate(d, "Y-m-d")
);
const result = formatted.join(", ");
console.log(result);
}
});
Такой подход обеспечивает:
В режиме диапазона:
mode: "range"
поведение отличается: Flatpickr всегда формирует диапазон как:
["2026-01-01", "2026-01-10"]
Даже если пользователь кликнет сначала на более позднюю дату, затем на раннюю, библиотека автоматически перестроит порядок.
Таким образом, сортировка для range обычно не требуется,
но есть исключения.
Если в приложении допускается ручное формирование массива дат (например, через API или восстановление состояния), может возникнуть необходимость перестраховаться:
function normalizeRange(dates) {
if (!dates || dates.length !== 2) return dates;
return dates.slice().sort((a, b) => a - b);
}
Это полезно при:
Flatpickr в multiple-режиме позволяет выбирать одну и ту же дату только один раз, но при программной модификации массива дубликаты могут появляться.
Сортировка в таком случае не решает проблему уникальности, поэтому используется комбинация:
const uniqueSorted = Array.from(
new Set(selectedDates.map(d => d.getTime()))
)
.sort((a, b) => a - b)
.map(t => new Date(t));
Здесь:
Set удаляет дубликатыDateСортировка всегда выполняется по времени в миллисекундах, независимо от:
Но при выводе важно учитывать форматирование:
fp.set("dateFormat", "d.m.Y");
или:
fp.formatDate(date, "d.m.Y H:i");
Сортировка и форматирование — два независимых этапа обработки данных.
Частая ошибка — попытка сортировать строки:
selectedDates.map(d => fp.formatDate(d, "Y-m-d")).sort()
Такой подход корректен только при ISO-формате
YYYY-MM-DD, где лексикографический порядок совпадает с
хронологическим.
При форматах вроде:
DD.MM.YYYYMM/DD/YYYYсортировка строк приводит к некорректным результатам.
Правильный подход — сортировать Date, а не строки.
В сложных приложениях может потребоваться кастомная логика сортировки:
function compareDates(a, b) {
return a.getFullYear() - b.getFullYear() ||
a.getMonth() - b.getMonth() ||
a.getDate() - b.getDate();
}
Этот вариант полезен, если:
При ограничениях диапазона:
minDate: "2026-01-01",
maxDate: "2026-12-31"
сортировка остаётся независимой, но важно учитывать:
Поэтому иногда добавляется фильтрация:
const valid = selectedDates.filter(d =>
d >= fp.config.minDate && d <= fp.config.maxDate
);
Flatpickr позволяет программно изменять выбранные даты:
fp.setDate(["2026-05-10", "2026-01-01", "2026-03-15"]);
После такого вызова порядок будет соответствовать переданному массиву, а не сортировке.
Если требуется хронология:
fp.setDate(
["2026-05-10", "2026-01-01", "2026-03-15"]
.map(d => new Date(d))
.sort((a, b) => a - b)
);
При работе с HTML-формами Flatpickr часто используется как источник значения input:
const input = document.querySelector("#input");
Чтобы гарантировать отсортированное значение в поле:
onChange: function(selectedDates, dateStr, instance) {
const sorted = selectedDates.slice().sort((a, b) => a - b);
input.value = sorted
.map(d => instance.formatDate(d, "Y-m-d"))
.join(",");
}
Это особенно важно при:
Если включены временные значения:
enableTime: true
сортировка автоматически учитывает:
Пример:
new Date("2026-05-10 10:00") < new Date("2026-05-10 12:00")
Никаких дополнительных условий не требуется.
На практике чаще всего встречаются следующие проблемы:
selectedDates напрямуюrange-логикиКаждая из этих ошибок приводит к рассинхронизации UI и внутреннего состояния Flatpickr.
Корректный подход обработки выбранных дат строится на трёх принципах:
Date-объектами