【问题标题】:Chart.js showing time (HH:MM:SS - 24 hour clock) on xAxisChart.js 在 xAxis 上显示时间(HH:MM:SS - 24 小时制)
【发布时间】:2017-08-09 11:10:03
【问题描述】:

我有一个 .Net Core 应用程序,我在其中绘制了一个图表,显示了一天中某些测量值的值。

我的“时间”对象是 Unix 时间,以毫秒为单位(例如 1502258405000)。我已设法将其手动转换为时间对象,如下所示:

var datetimes = $.map(data, function (value, index) {
    var datetime = new Date(value.timestamp);
    var iso = datetime.toISOString().match(/(\d{4}\-\d{2}\-\d{2})T(\d{2}:\d{2}:\d{2})/);
    return iso[2]; //Returns HH:MM:SS
});

但是,通过这种转换,我的 chart.js 图表无法将时间对象理解为时间,这意味着(如果测量中存在差距)它不会显示(并且存在),因为它只会显示测量值彼此相邻并将它们作为字符串处理。

我对显示日期不感兴趣,因为数据总是会在已知日期内收集。我将上面的实现更改为:

var datetimes = $.map(gpsData, function (value, index) {
    return new Date(value.timestamp);
});

但是,当我在我的 chart.js 折线图上绘制它时,它会使我的图表显示不需要的 AM/PM 值,如上所示。我想要一个 24 小时制的时钟。我使用xAxis 的chart.js 时间值如下图所示绘制上图所示的值:

options: {
    scales: {
        xAxes: [{
            type: 'time',
            time: {
                format: "HH:MM:SS",
                min: minTime, //calculated above in my implementation
                max: maxTime  //same as above
            }
        }]
    }
}

但是,这些值未格式化为我想要的输出。所以我想知道使用 chart.js 将 time of day 添加到我的图表上的 x 轴的正确方法是什么,甚至如何将其格式化为我想要的值?

【问题讨论】:

  • 您是否尝试过此解决方案来格式化您的日期? stackoverflow.com/questions/37061945/…
  • 是的。我能想到的所有组合都与该解决方案相结合。问题似乎是 Chart.js 经过大量研究后不支持 24 小时制。我在他们的文档中找不到任何其他说明。
  • 你能给我一个jsfiddle吗?也许您必须手动编写 xAxis
  • 我会继续这样做的。
  • 或者你可以试试这个来自定义你的带有刻度功能的 xAxis,我只是从其他 ppl 的 Demo 中做一个简单的改变,祝你好运。 jsfiddle.net/prfd1m8q/999

标签: javascript datetime time chart.js axis-labels


【解决方案1】:

实际上这是支持的(至少在最新版本的 chartjs 中)。

您似乎必须为 chartjs 可以显示的所有不同格式指定格式。

检查: https://www.chartjs.org/docs/latest/axes/cartesian/time.html#display-formats

在我的项目中,以下对我有用:

 xAxes: [{
    type: 'time',
    time: {
        parser: timeFormat,
        // round: 'day'                                                                                                                                                                            
        tooltipFormat: 'YYYY-MM-DD HH:mm',
        displayFormats: {
            millisecond: 'HH:mm:ss.SSS',
            second: 'HH:mm:ss',
            minute: 'HH:mm',
            hour: 'HH'
        }
    },
    display: true,
    scaleLabel: {
        display: true,
        labelString: 'Time'
    }
 }],

【讨论】:

    【解决方案2】:

    我发现 Chart.js 无法做到这一点,所以我转而使用支持此功能的 Highcharts.js。

    下面是我的解决方案代码:

    function tripSpeedsLineGraph() {
        var gpsData = @Html.Raw(Json.Serialize(Model.gpsData));
    
        chartData = []
        var reqData = $.map(gpsData, function (value, index) {
             chartData.push([new Date(value.timestamp), value.sp]);
        });
    
        var chart = Highcharts.chart('tripSpeedsLineChart', {
            chart: {
                type: 'spline',
                zoomType: 'x',
                panning: true,
                panKey: 'shift'
            },
            title: {
                text: "Speed during trip"
            },
            subtitle: {
                text: 'Click and drag to zoom in. Hold down shift key to pan.'
            },
            xAxis: {
                type: 'datetime',
                dateTimeLabelFormats: {
                    day: '%b %H:%M:%S'
                },
                title: {
                    text: 'Time of day'
                }
            },
            yAxis: {
                title: {
                    text: 'Speed'
                },
                min: 0
            },
            tooltip: {
                crosshairs: [true],
                formatter: function () {
                    return "Datetime: " + moment.utc(moment.unix(this.x/1000)).format("DD/MM-YYYY HH:mm:ss") + "<br> Speed: " + this.y;
                }
            },
            series: [{
                name: 'Speed Data',
                data: chartData
            }]
        });
    }
    

    最后的结果是这样的:

    【讨论】:

      【解决方案3】:

      试试这个:

      scales: {
        xAxes: [{
          type: 'time',
          time: {
            unit: 'minute',
            unitStepSize: 30,
            displayFormats: {
               'minute': this.person.Use24h ? 'HH:mm' : 'hh:mm A'
            }
          }
        }]
      }
      

      【讨论】:

      • 好像不行,可以加个demo sn-p。
      【解决方案4】:

      使用 Chart.js v2.9.4,对我来说这很有效:

      scales: {
        xAxes: [{
          type: 'time',
          time: {
            displayFormats: {hour: 'HH:mm'}
          }
        }]
       }
      

      【讨论】:

      • 感谢伙伴 - 帮了大忙!
      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多