C3 xFormat 不适用于以秒为单位的时间戳

C3 xFormat is not working for timestamp in seconds

首先有个类似的问题 and I also read GitHub issues related to xFormat & timestamp (i.e. here)。 None 这些解决了我的问题。

来自 D3 Time Format

%Q - milliseconds since UNIX epoch.
%s - seconds since UNIX epoch.

当使用 xFormat: '%Q' 和以毫秒为单位的时间戳(即 1524362421000)时,它可以正常工作。

但是当使用 xFormat: '%s' 和以秒为单位的时间戳(即 1524362421)时,x 轴上的所有刻度线显示错误的日期:1970-01-18)

axis: {
    x: {
      type: 'timeseries',
      tick: {
          fit: true,
          format: "%Y-%m-%d",
          rotate: 45
     }
}

Here is the JS Fiddle

来自 API 的 JSON 响应使用以秒为单位的时间戳,我无法将其更改为毫秒(我知道 JS 使用毫秒来解析日期)。因此,我需要 xFormat: '%s' 才能工作。

实际上,您的代码发生了什么是 xFormat 没有对您的格式字符串执行任何操作 - 当您不使用刻度格式化程序时,它直接格式化字符串。您可以删除它,它仍然可以与 millis 一起使用,因为它的 "type":"timeseries" 参数来自 tick ,它正在发挥所有的魔力。但是,正如您所说,我们可以使用 d3.js 时间格式化程序来研究解决方案。作为解决方案,您可以将 xAxisSettings 替换为:

var xAxisSetting = {
  //type: 'timeseries',
  tick: {
    fit: true,
    format:function (x) {
        var formatSeconds = d3.time.format("%Y-%m-%d")
        return formatSeconds(new Date(x*1000)); },
    count: 8,
    rotate: 45
  },
  label: {
    text: 'Date',
    position: 'outer-center'
  },
  //min: xMin,
  //max: xMax,
  padding: {
    left: 0,
    right: 0
  },
  height: 70
};

我们在这里做了什么:

  • 我们在进行自己的时间格式化时注释掉了时间序列类型(不要忘记将 d3-time 和 d3-time-format 导入您的项目)。如果您不删除此行,它将被格式化为日期,并且它不会保留为我们自己进行格式化的时间戳。
  • 该格式现在有一个函数,其中参数 x 是来自您的 json 对象的秒字符串。我们只是在函数内编写 d3 简单秒格式化程序。
  • 格式化程序需要一个日期作为参数,所以我们创建一个以毫秒为单位的参数(秒 * 1000)

You can see it working here。希望能达到您的期望。