如何在 Highcharts Stock 中正确配置日期轴与动态当前日期

阿瑶君_9087

阿瑶君_9087

2026-07-11

792人浏览

原创

如何在 Highcharts Stock 中正确配置日期轴与动态当前日期

本文详解如何将 Highcharts 普通图表升级为 Highcharts Stock 图表,重点解决日期轴(xAxis)不支持 categories、需改用时间戳格式、以及自动同步显示当前日期的问题。

本文详解如何将 highcharts 普通图表升级为 highcharts stock 图表,重点解决日期轴(xaxis)不支持 `categories`、需改用时间戳格式、以及自动同步显示当前日期的问题。

Highcharts Stock 与基础 Highcharts 在数据结构和坐标轴处理上有本质区别:Stock 图表专为时间序列设计,其 xAxis 默认启用时间轴(datetime type),不接受 categories 数组,而要求数据点必须为 [timestamp, value] 格式的时间戳数组。若沿用原 Highcharts 的字符串日期分类(如 ["2024-06-01", "2024-06-02"]),会导致 xAxis 渲染异常、日期错位、甚至无法显示当前日期标签。

✅ 正确做法:统一使用毫秒级时间戳

首先,在后端返回数据时,需将 fecha_actualizacion 字段转换为 JavaScript 可识别的毫秒时间戳(UTC 时间)。推荐在 PHP 模型中进行标准化处理:

Muset
Muset

Muset是面向深度创作者的 AI 原生写作工具。

下载
// 在 model_venta->montos() 方法中调整:
public function montos(){
    $this->db->select("DATE(fecha_actualizacion) as fecha, SUM(total) as monto");
    $this->db->from("venta");
    $this->db->where("pago_id", "2");
    $this->db->where("estado", "1");
    $this->db->group_by('DATE(fecha_actualizacion)');
    $this->db->order_by('fecha_actualizacion');
    $resultados = $this->db->get()->result();

    // 转换为 UTC 时间戳(毫秒),确保时区一致性
    foreach ($resultados as &$row) {
        $date = new DateTime($row->fecha, new DateTimeZone('America/Bogota'));
        $date->setTimezone(new DateTimeZone('UTC'));
        $row->timestamp = $date->getTimestamp() * 1000; // 转为毫秒
    }
    return $resultados;
}

前端 AJAX 成功回调中,构造符合 Stock 要求的二维数组:

function datagrafico(base_url){
    $.ajax({
        url: base_url + "index.php/Admin/getDataDias",
        type: "POST",
        dataType: "json",
        success: function(data){
            const seriesData = data.map(item => [
                item.timestamp,      // x: 毫秒时间戳(必需)
                Number(item.monto)   // y: 数值
            ]);

            graficar(seriesData);
        }
    });
}

function graficar(seriesData){
    Highcharts.stockChart('grafico', {
        chart: {
            type: 'column',
            height: 400
        },
        title: {
            text: 'Monto acumulado por ventas diarias'
        },
        xAxis: {
            type: 'datetime',
            labels: {
                formatter: function () {
                    return Highcharts.dateFormat('%Y-%m-%d', this.value);
                }
            },
            // 自动包含最新日期(即“当前日期”)——无需手动添加,Stock 会根据数据范围智能渲染
        },
        yAxis: {
            min: 0,
            title: {
                text: 'Monto Acumulado (Colombiano)'
            }
        },
        tooltip: {
            pointFormat: '<b>{point.y:,.0f} Colombiano</b><br>Fecha: {point.x:%Y-%m-%d}',
            dateTimeLabelFormats: {
                day: '%Y-%m-%d'
            }
        },
        plotOptions: {
            column: {
                pointPadding: 0,
                borderWidth: 0,
                dataLabels: {
                    enabled: true,
                    format: '{y:,.0f}'
                }
            }
        },
        rangeSelector: {
            buttons: [{
                type: 'day',
                count: 7,
                text: '7d'
            }, {
                type: 'month',
                count: 1,
                text: '1m'
            }, {
                type: 'all',
                text: 'Todo'
            }],
            selected: 2 // 默认显示全部范围
        },
        series: [{
            name: 'Ventas diarias',
            data: seriesData,
            color: '#4a75c2'
        }]
    });
}

⚠️ 关键注意事项

  • 禁止使用 xAxis.categories:Highcharts Stock 的 xAxis 不识别该配置,强行设置将导致图表空白或报错;
  • 时间戳必须为毫秒(非秒):JavaScript Date.getTime() 返回的是毫秒,务必乘以 1000;
  • 时区一致性至关重要:数据库中 fecha_actualizacion 若为本地时间(如 Colombia),需显式转换为 UTC 时间戳,避免因浏览器时区差异导致日期偏移;
  • 当前日期自动呈现:只要数据中包含最新日期对应的时间戳,Stock 图表会自动将其纳入 xAxis 范围并正确标注——无需额外逻辑“插入今日”;
  • 建议启用 rangeSelector:便于用户快速切换时间范围,提升交互体验。

通过以上改造,图表不仅能正确渲染每日销售数据,还能精准对齐真实日期轴、响应式缩放,并天然支持“今日”作为最右端索引——真正实现动态、可靠、专业的时间序列可视化。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4906

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1209

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4844

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

960

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1876

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3465

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

4513

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

2960

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

948

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Highcharts中文参考手册
Highcharts中文参考手册

共16课时 | 12.8万人学习