【发布时间】:2020-03-28 11:46:59
【问题描述】:
总结
我收集了大量不同日期时间的数据。目前我已经能够将我的所有数据分组以在本地时区正确显示;然而,当试图在不同的时区显示这些数据时,lineChart 上的线条会变得不连贯,并且它们之间的连接不像在本地时区那样平滑。
我在这里找到了这个链接,详细说明了一个可能的解决方案,但遗憾的是,如果我没有复制我的整个数据集,时间从 UTC 偏移,然后正常一次,这将无法工作。我拥有的数据不仅用于几个图表中以获取有关趋势和统计数据的见解,而且还有一个用于显示/编辑/审查特定数据成员的原始表。因此,将其中一个转换为 utc 时间并计算 utc 时间的时间变化会抛出另一个。
https://groups.google.com/forum/#!msg/d3-js/iWmP9Npv2Go/xyypdLjWu2QJ
我的问题是:有没有办法跨时区转换日期时间数据并让 dc.js 尊重您想要显示的时区。我希望调整后的图表看起来与本地图表的线条相同基于时区不是片面的。
代码和照片
小提琴:https://jsfiddle.net/spacarar/j0urt9sy/49/
这是我当地时区的正确显示图像。线条是日期之间的平滑过渡。
这是任何其他时区的错误显示图像(取决于我本地的哪一侧将方向从左倾变为右倾)
我的数据的简化版本如下所示:
var data = [
{
value: 42,
datetime: '2019-10-24T07:18:00.000000'
},
{
value: 10,
datetime: '2019-10-24T07:19:12.000000'
},
{
value: 12,
datetime: '2019-10-29T04:18:00.000000'
},
{
value: 8,
datetime: '2019-10-29T09:18:00.000000'
}
]
然后我伪造组来填充数据中可能不存在的任何日期,并使用时刻时区对其进行翻译,最终得到与此类似的数据结构
{
value: 0,
datetime: moment timezone object with full datetime,
date: moment timezone object representing only date (0 hours, minutes, seconds, ms)
}
然后使用这个虚假的分组/固定数据创建带有以下代码的图表
var ndx = dc.crossfilter(fakeGroupedData)
var dateDim = ndx.dimension(dc.pluck('date'))
var top = dateDim.top(1)[0] ? dateDim.top(1)[0].date : null
var bottom = dateDim.bottom(1)[0] ? dateDim.bottom(1)[0].date : null
var chart = dc.lineChart('#date-chart')
chart.yAxis().tickFormat(dc.d3.format(',.0f'))
chart.xAxis().ticks(10).tickFormat(d => moment(d).format('M/D'))
chart.dimension(dateDim)
.group(dateDim.group().reduceSum(dc.pluck('value')))
.x(dc.d3.scaleTime().domain([bottom, top]).nice())
.elasticY(true)
.renderArea(true)
.render()
【问题讨论】:
标签: d3.js momentjs dc.js moment-timezone