Работа с временными данными в Chart.js опирается на идею оси времени как полноценного типа шкалы, способного интерпретировать даты, метки времени и интервалы без ручного преобразования значений в категориальные индексы. В отличие от категориальных и линейных осей, временная шкала выполняет парсинг, нормализацию и равномерное распределение точек по времени, что критично для аналитических графиков, финансовых данных и телеметрии.
Временные данные в datasets могут задаваться двумя основными
способами: через объекты {x, y} и через массивы значений
при наличии отдельной конфигурации оси времени.
{x, y}Наиболее универсальный вариант — явная передача координат:
const data = {
datasets: [{
label: 'Температура',
data: [
{ x: '2026-01-01', y: 12 },
{ x: '2026-01-02', y: 14 },
{ x: '2026-01-03', y: 9 }
]
}]
};
Поле x может содержать:
YYYY-MM-DD)Поле y — числовое значение, соответствующее
измерению.
Для высокоточных данных (логирование, IoT, трейдинг) предпочтительно использовать Unix timestamp:
data: [
{ x: 1704067200000, y: 120 },
{ x: 1704153600000, y: 135 },
{ x: 1704240000000, y: 128 }
]
Такой формат снижает неоднозначность парсинга и ускоряет обработку.
Чтобы Chart.js интерпретировал значения x как время,
необходимо явно указать тип оси:
options: {
scales: {
x: {
type: 'time'
}
}
}
Без этого параметра значения будут трактоваться как категории или линейные индексы.
Временная шкала не содержит встроенного полноценного парсера дат. Вместо этого используется система адаптеров времени.
На практике применяются:
Пример подключения адаптера:
import 'chartjs-adapter-date-fns';
После подключения Chart.js получает возможность:
Временная шкала поддерживает несколько форматов:
{ x: '2026-05-17T10:00:00Z', y: 42 }
Используются для совместимости с API и серверными логами.
{ x: new Date(2026, 4, 17), y: 30 }
Удобны в клиентских вычислениях, но требуют осторожности из-за локального времени.
{ x: Date.now(), y: 55 }
Наиболее стабильный формат для больших данных.
Ось времени автоматически подбирает единицы измерения:
Например, при данных за несколько часов Chart.js переключится на отображение минутных или часовых делений.
options: {
scales: {
x: {
type: 'time',
time: {
unit: 'hour'
}
}
}
}
Ручная фиксация unit используется при необходимости
стабильного отображения.
Ключевой блок конфигурации — time:
options: {
scales: {
x: {
type: 'time',
time: {
minUnit: 'minute',
tooltipFormat: 'yyyy-MM-dd HH:mm',
displayFormats: {
hour: 'HH:mm',
day: 'MMM dd'
}
}
}
}
}
При работе с временными рядами большого объёма (тысячи и миллионы точек) важным становится снижение нагрузки на рендеринг.
Chart.js использует механизмы:
Пример включения decimation:
options: {
datasets: {
line: {
parsing: false
}
},
plugins: {
decimation: {
enabled: true,
algorithm: 'lttb'
}
}
}
Алгоритм LTTB (Largest-Triangle-Three-Buckets) сохраняет визуальную форму графика при сильном уменьшении количества точек.
Для корректного отображения временная шкала требует упорядоченности данных по возрастанию времени. При несортированных входных данных возможны:
Рекомендуемая подготовка:
data.sort((a, b) => a.x - b.x);
Если x — строка, предварительно выполняется
преобразование:
data.sort((a, b) => new Date(a.x) - new Date(b.x));
Chart.js допускает альтернативный формат, где временные метки задаются отдельно:
labels: [
'2026-01-01',
'2026-01-02',
'2026-01-03'
],
datasets: [{
data: [10, 20, 15]
}]
В этом случае labels интерпретируются как временная шкала только при
включении соответствующей оси. Однако такой подход менее гибок, чем
использование {x, y}.
Работа с временными зонами зависит от используемого адаптера. В базовой конфигурации:
Для избежания расхождений рекомендуется:
При пропусках во временных рядах Chart.js не создаёт значения автоматически. Поведение зависит от типа графика:
datasets: [{
data: [...],
spanGaps: true
}]
Отображение времени в tooltip настраивается отдельно:
options: {
plugins: {
tooltip: {
callbacks: {
label: function(context) {
return `${context.parsed.x} → ${context.parsed.y}`;
}
}
}
}
}
При использовании адаптера можно применять локализованные форматы
через time.tooltipFormat, что снижает необходимость ручного
форматирования.
Управление видимым диапазоном осуществляется через:
options: {
scales: {
x: {
min: '2026-01-01',
max: '2026-01-31'
}
}
}
Также допустимы timestamp значения:
min: 1704067200000,
max: 1706745600000
В одном графике допускается использование временной оси с несколькими dataset, где каждый набор данных может иметь разную плотность и характер изменения:
datasets: [
{
label: 'Продажи',
data: [{ x: '2026-01-01', y: 200 }]
},
{
label: 'Посещения',
data: [{ x: '2026-01-01', y: 1200 }]
}
]
Обе серии синхронизируются по оси времени, независимо от частоты измерений.
При охвате больших промежутков (годы, десятилетия) Chart.js:
Это предотвращает перегрузку интерфейса и сохраняет читаемость.
Формат отображения временных значений влияет только на визуализацию, но не на внутреннюю модель данных. Это позволяет:
time: {
displayFormats: {
millisecond: 'HH:mm:ss.SSS',
second: 'HH:mm:ss',
minute: 'HH:mm',
hour: 'HH:mm'
}
}
При передаче данных через API важно учитывать, что:
Поэтому наиболее устойчивый формат — числовые метки времени, исключающие неоднозначность интерпретации.