You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js按天和小时分组ISO日期 适配Chart.js折线图绘制

Chart.js 按天+小时分组渲染折线图实现

1. 同天同小时日期分组逻辑

核心思路是为每条ISO日期生成天+小时维度的唯一分组键,将相同键的数据归为同一组。针对标准UTC格式的ISO日期字符串,直接截断到小时位即可快速生成分组键,无需额外做日期转换。

// 原始数据源
const rawData = [
  { date: '2022-06-10T07:32:07.744Z' },
  { date: '2022-06-10T08:32:38.490Z' },
  { date: '2022-06-10T07:32:58.720Z' },
  { date: '2022-06-10T07:33:25.121Z' },
  { date: '2022-06-10T07:35:18.556Z' },
  { date: '2022-06-10T07:35:56.459Z' },
  { date: '2022-06-10T07:36:38.736Z' },
  { date: '2022-06-10T07:36:38.736Z' }
];

const groupMap = {};
rawData.forEach(item => {
  // 截取字符串前13位,得到 YYYY-MM-DDTHH 格式的分组键,精确到小时
  const hourKey = item.date.slice(0, 13);
  if (!groupMap[hourKey]) groupMap[hourKey] = [];
  groupMap[hourKey].push(item);
});

// 组装Chart.js需要的数据集,标签按时间升序排列
const chartLabels = Object.keys(groupMap).sort();
const chartData = chartLabels.map(key => groupMap[key].length);

针对示例数据,分组后结果如下:

  • 分组键2022-06-10T07:共匹配7条数据
  • 分组键2022-06-10T08:共匹配1条数据

2. 折线图渲染配置

拿到分组后的标签和数据后,直接传入Chart.js实例即可完成渲染:

// 替换为你页面上的canvas元素上下文
const ctx = document.getElementById('lineChartDom').getContext('2d');
new Chart(ctx, {
  type: 'line',
  data: {
    labels: chartLabels,
    datasets: [{
      label: '小时级数据统计',
      data: chartData,
      borderColor: '#1677ff',
      backgroundColor: 'rgba(22, 119, 255, 0.1)',
      fill: true,
      tension: 0.3,
      pointRadius: 4,
      pointHoverRadius: 6
    }]
  },
  options: {
    responsive: true,
    scales: {
      x: {
        title: { display: true, text: '时间(小时粒度)' }
      },
      y: {
        beginAtZero: true,
        title: { display: true, text: '数据条数' }
      }
    }
  }
});

业务涉及时区转换时,不要直接截断ISO字符串,需先将日期转换为对应时区的时间对象,再格式化生成年-月-日 小时格式的分组键,避免UTC时间与业务时区不一致导致分组错误。

内容的提问来源于stack exchange,提问作者0xMukesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:24:19