Библиотека Flatpickr строится вокруг работы с датами, однако в
процессе конфигурации и взаимодействия с экземпляром календаря
используется несколько различных типов данных. Несмотря на то, что
JavaScript не является строго типизированным языком, Flatpickr опирается
на предсказуемые структуры: Date, строки, числа
(timestamp), массивы и специализированные внутренние представления.
Корректное понимание типов данных определяет стабильность работы календаря, отсутствие ошибок парсинга и правильную интеграцию с API.
Центральным типом данных в Flatpickr является объект
Date.
Практически все внутренние вычисления выполняются именно с ним:
selectedDates) хранится как массив
DateminDate,
maxDate) принимают DateDate-объектыDate.getTime()Пример базового использования:
flatpickr("#input", {
onChange: function(selectedDates) {
const date = selectedDates[0];
console.log(date instanceof Date);
}
});
Особенность Flatpickr заключается в том, что даже если входные данные
представлены строкой или числом, внутри библиотеки они почти всегда
преобразуются в Date.
Строки используются в Flatpickr как внешний формат данных. Они применяются в нескольких контекстах:
defaultDate в виде строкиminDate и maxDate как строковые
ограничения<input>Пример:
flatpickr("#input", {
defaultDate: "2026-06-01"
});
Строки интерпретируются на основе параметра dateFormat.
Если формат не совпадает, Flatpickr пытается выполнить fallback-парсинг
через нативный Date.parse, что может приводить к
нестабильному поведению.
Ключевым механизмом работы со строками является параметр
dateFormat.
Он определяет:
DateDate преобразуется в строкуПример:
flatpickr("#input", {
dateFormat: "d.m.Y"
});
Внутри Flatpickr используется собственный парсер, который разбивает строку по токенам:
d — деньm — месяцY — годH — часыi — минутыТип данных здесь фактически двусторонний:
stringDatestringПри включении режима множественного выбора
(mode: "multiple"), Flatpickr начинает использовать массив
дат как основной тип результата.
flatpickr("#input", {
mode: "multiple"
});
В этом режиме:
selectedDates становится массивом
Date[]Пример структуры:
[
Date,
Date,
Date
]
Важная особенность: порядок дат в массиве не всегда гарантирован пользователем, но Flatpickr старается поддерживать хронологическую сортировку при внутренних операциях.
Режим диапазона (mode: "range") вводит специфическую
модель данных: пара дат, интерпретируемая как начало и конец
периода.
flatpickr("#input", {
mode: "range"
});
Внутреннее представление:
selectedDates[0] — начало диапазонаselectedDates[1] — конец диапазона (может
отсутствовать)Тип данных:
Date | undefined
При обработке диапазонов Flatpickr использует дополнительные проверки:
Flatpickr поддерживает использование числовых значений, интерпретируемых как timestamp.
flatpickr("#input", {
defaultDate: 1717200000000
});
Числовой тип:
number (миллисекунды с 1970-01-01)Date через
new Date(timestamp)Особенности:
Ограничения диапазона дат допускают несколько типов значений:
Datestringnumber (timestamp)flatpickr("#input", {
minDate: "2026-01-01",
maxDate: new Date()
});
Flatpickr приводит все варианты к внутреннему Date, но
логика сравнения всегда выполняется через числовое представление:
date.getTime()
Это позволяет унифицировать сравнение независимо от входного формата.
defaultDate — один из наиболее гибких параметров по типу
данных.
Он может принимать:
DatestringnumberDate[] | string[] | number[])Пример:
flatpickr("#input", {
defaultDate: ["2026-01-01", "2026-01-10"]
});
В зависимости от режима (single, multiple,
range) Flatpickr интерпретирует массив по-разному:
single — берётся первый элементmultiple — все элементы добавляются в selectionrange — первые два элемента формируют диапазонВнутренний цикл обработки данных включает несколько стадий:
Input normalization
Parsing
parseDateNormalization
DateStorage
selectedDatesFormatting
Схематично:
input (string | number | Date)
↓
normalize
↓
Date
↓
selectedDates[]
↓
formatDate → string
Flatpickr поддерживает разделение между реальным значением и отображаемым:
input — скрытое или основное значениеaltInput — пользовательское отображениеТипы данных:
input.value всегда stringaltInput.value также stringDateПример:
flatpickr("#input", {
altInput: true,
altFormat: "F j, Y",
dateFormat: "Y-m-d"
});
Здесь происходит разделение:
"June 1, 2026""2026-06-01"DateFlatpickr поддерживает время как часть даты, расширяя тип
Date.
Используемые значения:
H)i)S)flatpickr("#input", {
enableTime: true,
dateFormat: "Y-m-d H:i"
});
Тип данных не меняется — всё ещё Date, но с расширенными
полями времени.
Важно учитывать:
Date хранит время в UTC-основанной
структуреПри передаче данных во внешние системы Flatpickr не использует собственный формат сериализации. Обычно применяются:
dateFormatПример преобразования:
const iso = selectedDates[0].toISOString();
const ts = selectedDates[0].getTime();
Рекомендуемая модель обмена:
DateНесоответствие типов данных приводит к предсказуемым ошибкам:
1. Строка без формата
defaultDate: "01/02/03"
Неоднозначная интерпретация приводит к разным результатам в разных браузерах.
2. Использование секунд вместо миллисекунд
defaultDate: 1717200000 // ошибка
3. Несовместимые массивы в range mode
defaultDate: ["2026-01-10", "2026-01-01"]
Требует внутренней нормализации.
4. Смешивание типов
defaultDate: [new Date(), "2026-01-01", 1717200000000]
Работает, но усложняет предсказуемость логики.
Для стабильной работы с Flatpickr часто используется явное приведение типов:
function normalizeDate(value) {
return new Date(value);
}
Или более строгий подход:
function toTimestamp(date) {
return date instanceof Date ? date.getTime() : new Date(date).getTime();
}
Такая унификация особенно важна при интеграции с API и серверными данными.
Тип данных в Flatpickr напрямую зависит от режима:
single → Datemultiple → Date[]range → [Date, Date | undefined]Это создаёт динамическую типизацию на уровне конфигурации, что
требует аккуратного обращения с результатами
selectedDates.
Внутренняя модель может быть представлена как:
value: string (UI)
selectedDates: Date[]
config input: string | Date | number | array
internal model: Date
output API: Date | string | number[]
Такая многослойная структура обеспечивает гибкость, но требует строгого понимания типов при разработке интеграций и расширений.