Ось времени в Chart.js реализуется через шкалу
type: 'time', которая предназначена для работы с датами,
временными интервалами и их визуализацией на графиках.
Ключевая особенность временной шкалы заключается в том, что она не оперирует строками как категориями и не требует заранее подготовленных индексов. Вместо этого используется нормализованное представление времени, которое затем преобразуется в координаты на оси X или Y.
Основные задачи временной шкалы:
Chart.js принимает несколько типов входных данных, которые могут быть интерпретированы как дата.
Наиболее предпочтительный формат:
{
x: '2026-01-01',
y: 10
}
Также поддерживаются расширенные варианты:
2026-01-01T10:30:002026-01-01T10:30:00Z2026-01-01T10:30:00+06:00ISO формат обеспечивает минимальное количество ошибок при парсинге и является стандартом для большинства адаптеров времени.
Поддерживаются числовые значения времени:
{
x: 1704067200000,
y: 15
}
Значение интерпретируется как миллисекунды с 1 января 1970 года (UTC).
Важно:
{
x: new Date('2026-01-01'),
y: 20
}
Chart.js автоматически вызывает valueOf() у объекта
Date, преобразуя его в timestamp.
Наиболее универсальный формат для временной шкалы:
data: [
{ x: '2026-01-01', y: 10 },
{ x: '2026-01-02', y: 12 }
]
Такой подход предпочтителен при работе с time scale, так как
исключает необходимость использования labels.
Парсинг — процесс преобразования входных значений в внутренний формат времени (обычно timestamp).
По умолчанию Chart.js пытается определить тип входных данных автоматически:
valueOf().В конфигурации можно задать правило интерпретации строк:
options: {
scales: {
x: {
type: 'time',
time: {
parser: 'yyyy-MM-dd'
}
}
}
}
Парсер особенно важен, если формат даты нестандартный:
dd.MM.yyyyyyyy/MM/dd HH:mmMM-dd-yyyyChart.js не включает собственный движок дат. Он использует внешние адаптеры:
Адаптер отвечает за:
Ось времени автоматически масштабируется в зависимости от диапазона данных. Используются стандартные единицы:
Если явно не указано unit, Chart.js анализирует
диапазон:
secondminutehourdaymonthtime: {
unit: 'day'
}
Это фиксирует шаг оси независимо от плотности данных.
Позволяет задать интервал между делениями:
time: {
unit: 'day',
stepSize: 2
}
Результат: метки будут отображаться через каждые 2 дня.
Отображение подписей регулируется через
displayFormats.
time: {
unit: 'month',
displayFormats: {
month: 'MMM yyyy'
}
}
yyyy-MM-dd — датаHH:mm — времяMMM yyyy — месяц и годdd MMM — день и месяцФорматирование зависит от адаптера:
Chart.js автоматически определяет диапазон оси по данным:
Можно задать вручную:
scales: {
x: {
min: '2026-01-01',
max: '2026-12-31'
}
}
Это фиксирует область отображения независимо от данных.
labels: ['2026-01-01', '2026-01-02']
Это строковые категории, не временная шкала.
data: [
{ x: '2026-01-01', y: 10 },
{ x: '2026-01-02', y: 20 }
]
Разница принципиальная:
ticks: {
source: 'auto'
}
Возможные значения:
auto — автоматически;data — только по данным;labels — только по меткам (редко используется с time
scale).ticks: {
maxTicksLimit: 8
}
Позволяет избежать перегруженности оси при длинных временных рядах.
Адаптеры поддерживают локализацию:
Пример (Luxon):
options: {
locale: 'ru'
}
parser: 'yyyy-MM-dd'
dat a: '01/02/2026' // ошибка интерпретации
x: 1704067200 // неверно без преобразования
x: 1704067200000 // корректно
[
{ x: '2026-01-01', y: 10 },
{ x: 1704067200000, y: 12 }
]
Такой подход допустим, но усложняет отладку и может давать неожиданные смещения при разных адаптерах.
При больших объёмах данных критично учитывать:
Оптимальная модель для больших датасетов:
{ x: 1704067200000, y: value }
При нескольких datasets Chart.js использует общую временную шкалу:
datasets: [
{
label: 'A',
data: [{ x: '2026-01-01', y: 5 }]
},
{
label: 'B',
data: [{ x: '2026-01-01', y: 10 }]
}
]
Все серии приводятся к единой временной оси, независимо от плотности данных в каждом наборе.