Javascript 如何让D3数据驱动文档在正确的时区中显示moment.js datetime?
我正在开发一个AngularJS单页应用程序,它使用Javascript 如何让D3数据驱动文档在正确的时区中显示moment.js datetime?,javascript,angularjs,datetime,d3.js,momentjs,Javascript,Angularjs,Datetime,D3.js,Momentjs,我正在开发一个AngularJS单页应用程序,它使用D3图表来显示世界各地不同时区记录的数据。图表上的时间轴需要在其原始时区中显示时间 要绘制的数据是一个值、时间戳对数组。时间戳包含自己的时区信息,并以ISO格式编码(例如“2003-12-14T12:00:00.000+08:00”)。因此json看起来像这样: "values": [ ["2003-12-14T12:00:00.000+08:00", 10], ["2003-12-14T13:00:00.000+08:00", 2
D3
图表来显示世界各地不同时区记录的数据。图表上的时间轴需要在其原始时区中显示时间
要绘制的数据是一个值、时间戳对数组。时间戳包含自己的时区信息,并以ISO格式编码(例如“2003-12-14T12:00:00.000+08:00”
)。因此json看起来像这样:
"values": [
["2003-12-14T12:00:00.000+08:00", 10],
["2003-12-14T13:00:00.000+08:00", 20],
["2003-12-14T14:00:00.000+08:00", 30],
["2003-12-14T15:00:00.000+08:00", 40],
["2003-12-14T16:00:00.000+08:00", 50]
]
xAxis = d3.svg.axis()
.scale(xScale)
.tickValues(calculateTickValue)
.tickFormat(getTickFormat);
var getTickFormat = function(date){
var diff = date.format("DD") != previousDate.format("DD");
if (diff){
previousDate = date;
return date.format("MMM Do, HH:mm");
}
return date.format(tickFormat);
}
var calculateTickValue = function(){
var startTime = scope.segment.startTime;
var endTime = scope.segment.endTime;
var tickValues = [];
var difference = moment.duration(endTime.diff(startTime));
var maximumTicks = calculateMaximumTicks();
if (difference.asHours() >= maximumTicks){
tickValues = calculateHoursTicks(startTime, endTime, maximumTicks);
tickFormat = "HH:mm";
}
else {
tickValues = caclulateMinutesTicks(startTime, endTime, maximumTicks);
tickFormat = "HH:mm";
}
previousDate = startTime;
return tickValues;
}
然后将时间戳和值添加到对象中,在该对象中,时间戳将转换为一个时刻:
data = values[1];
timeStamp = moment.parseZone(values[0]);
然后将这些样本传递到D3
进行显示。但是,当它们被传递到D3
时,时间刻度将显示在本地浏览器时间中。这是不好的-我无法解决如何让它在正确的时区显示数据
我曾尝试使用自定义方法设置xAxis.tickFormat
,但传递给它的时间是本地时区中的标准Javascript日期对象
此外,时区可能在图表中间(由于DST)而改变,因此不可能简单地保持时区偏移的值并进行手动调整。
< P>答案是编写一种计算和返回蜱值的方法,同样地,由来自@ LaskOththOff.给出的滴答格式。
最终的代码应该是这样的:
"values": [
["2003-12-14T12:00:00.000+08:00", 10],
["2003-12-14T13:00:00.000+08:00", 20],
["2003-12-14T14:00:00.000+08:00", 30],
["2003-12-14T15:00:00.000+08:00", 40],
["2003-12-14T16:00:00.000+08:00", 50]
]
xAxis = d3.svg.axis()
.scale(xScale)
.tickValues(calculateTickValue)
.tickFormat(getTickFormat);
var getTickFormat = function(date){
var diff = date.format("DD") != previousDate.format("DD");
if (diff){
previousDate = date;
return date.format("MMM Do, HH:mm");
}
return date.format(tickFormat);
}
var calculateTickValue = function(){
var startTime = scope.segment.startTime;
var endTime = scope.segment.endTime;
var tickValues = [];
var difference = moment.duration(endTime.diff(startTime));
var maximumTicks = calculateMaximumTicks();
if (difference.asHours() >= maximumTicks){
tickValues = calculateHoursTicks(startTime, endTime, maximumTicks);
tickFormat = "HH:mm";
}
else {
tickValues = caclulateMinutesTicks(startTime, endTime, maximumTicks);
tickFormat = "HH:mm";
}
previousDate = startTime;
return tickValues;
}
显然,根据您需要的规模,这可以定制为数年、数月、数天、数小时等。您看到了吗?谢谢@Larskothoff-这真的很有帮助。解决了这个问题。