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
}
}
来自 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。希望能达到您的期望。
首先有个类似的问题
来自 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
}
}
来自 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。希望能达到您的期望。