Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让D3数据驱动文档在正确的时区中显示moment.js datetime?_Javascript_Angularjs_Datetime_D3.js_Momentjs - Fatal编程技术网

Javascript 如何让D3数据驱动文档在正确的时区中显示moment.js datetime?

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

我正在开发一个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", 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-这真的很有帮助。解决了这个问题。