Chart.js предоставляет две близкие по назначению, но архитектурно разные шкалы для работы с временными данными: time и timeseries. Обе предназначены для отображения данных по оси времени, однако различаются подходом к хранению, обработке и оптимизации данных.
Шкала time исторически является основной временной шкалой в Chart.js и основана на использовании адаптера дат (date adapter), который преобразует входные значения в объекты времени и затем вычисляет позиции на оси.
Ключевая особенность заключается в том, что шкала работает через парсинг дат и интервалов:
Date, timestampsТипичная структура данных:
data: {
datasets: [{
label: 'Продажи',
data: [
{ x: '2024-01-01', y: 10 },
{ x: '2024-01-02', y: 15 },
{ x: '2024-01-03', y: 8 }
]
}]
}
Настройка шкалы:
scales: {
x: {
type: 'time',
time: {
unit: 'day'
}
}
}
Шкала time предполагает, что данные уже достаточно структурированы и могут быть точно интерпретированы как временные точки с интервалами.
Шкала timeseries была добавлена для более эффективной работы с большими временными наборами данных и отличается упрощённой моделью обработки.
Главная идея заключается в том, что шкала оптимизирована под поток временных значений без необходимости сложного предварительного преобразования.
Особенности:
Пример данных:
data: {
datasets: [{
label: 'Трафик',
data: [
{ x: 1704067200000, y: 120 },
{ x: 1704153600000, y: 180 },
{ x: 1704240000000, y: 90 }
]
}]
}
Настройка шкалы:
scales: {
x: {
type: 'timeseries'
}
}
В отличие от time, здесь чаще используется UNIX
timestamp, что снижает накладные расходы на парсинг.
Различие между шкалами проявляется в том, как Chart.js обрабатывает входные значения.
'2024-01-01')Ось времени в time масштабируется по календарной
логике:
Ось в timeseries ведёт себя ближе к числовой оси с
временной интерпретацией:
Разница становится особенно заметной при увеличении объёма данных.
Временные ряды редко бывают идеально равномерными.
spanGaps при необходимостиОбязательное использование адаптера:
Без адаптера шкала не может корректно интерпретировать строки дат.
Может работать без сложного адаптера при использовании timestamp:
Позволяет гибко управлять отображением:
time: {
unit: 'month',
displayFormats: {
month: 'MMM yyyy'
}
}
Поддерживает богатую настройку календарных форматов.
Фокусируется на производительности и простом отображении:
При использовании плагинов масштабирования различия становятся заметнее.
Подходит для задач:
Оптимален для:
| Характеристика | time | timeseries |
|---|---|---|
| Парсинг дат | через адаптер | минимальный |
| Формат данных | строки/Date | timestamps |
| Производительность | средняя | высокая |
| Календарная логика | полная | упрощённая |
| Масштабируемость | ограниченная | высокая |
| Гибкость форматов | высокая | средняя |
Часто встречающиеся проблемы связаны с неправильным выбором между шкалами:
time для очень больших датасетов приводит
к просадкам производительностиtimeseries для календарных отчётов
усложняет форматированиеtime может ломать
визуализациюПереход с time на timeseries требует:
time блокаОбратная миграция требует восстановления календарного контекста и форматирования.
Выбор шкалы влияет не только на визуализацию, но и на структуру данных:
time стимулирует хранение данных в человекочитаемом
видеtimeseries стимулирует хранение данных в числовом
форматеtimeseriestime