javascript - D3 时区偏移量移至前一天

标签 javascript date d3.js nvd3.js

详细信息

  • 初始时间戳是来自服务器的 Unix 编码 EST 日期(无时间)。
  • NVD3(D3 分支)正在渲染带有焦点栏(画笔)的堆叠面积图,以允许导航数据。

问题

  • 图表显示的是本地时间的 X 轴,当您偏移时,该轴会落在不同的日期。
  • 尽管任何时间戳中都没有使用小时,但画笔(焦点图)正在处理以小时为单位的时间线。

所需的解决方案

  • 图表应以 EST 格式显示,忽略本地 TZ。
  • 刷牙应以天为单位设置,而不是设置时间(应为美国东部时间)。

图表初始化代码

function createStackedTimeSeriesChart(chartName, data, margins, tableName, ajaxPath, filterType, timeColumn, statuses, document_types, showLegend, percentage) {

    if(typeof(data) == 'undefined') {
        $('#' + chartName).parent().text('no data found');
        return;
    }

    if(data.length == 0) {
        $('#' + chartName).parent().text('no data found');
        return;
    }

    try {

        var maxValue = data[0]['values'][0]['x'];
        var minValue = maxValue;
        for(var i = 0; i < data.length; i++) {
            for(var v = 0; v < data[i]['values'].length; v++) {
                if(data[i]['values'][v]['x'] > maxValue) maxValue = data[i]['values'][v]['x'];
                if(data[i]['values'][v]['x'] < minValue) minValue = data[i]['values'][v]['x'];
                data[i]['values'][v]['x'] = new Date(data[i]['values'][v]['x']);
            }
        }

        var chart;
        nv.addGraph(function() {
            chart = nv.models.stackedAreaWithFocusChart()
                .useInteractiveGuideline(true)
                .x(function(d) { return d['x'] })
                .y(function(d) { return d['y'] })
                .controlLabels({stacked: "Stacked", expanded: "Expanded"})
                .duration(300)
                .color(function(d){return getChartColorByValue(d)})
                .showControls(false)
                .showLegend(showLegend)
                .clipEdge(false);

            var chart_wrapper = new Chart(chartName, chart, tableName, ajaxPath, data, filterType, timeColumn, statuses, document_types);
            chart_wrapper.oldest_date = moment(maxValue);
            chart_wrapper.dataTable.percentage = percentage;

            chart.interactiveLayer.tooltip.contentGenerator(tooltipContentGenerator(chart_wrapper));

            var extentPeriod = chart_wrapper.getCurrentYearSpan();
            chart.brushExtent([extentPeriod.begDate, extentPeriod.endDate]);

            chart.xAxis.tickFormat(function(d) { return d3.time.format('%d/%m/%Y') (new Date(d)) });
            chart.x2Axis.tickFormat(function(d) { return d3.time.format('%d/%m/%Y') (new Date(d)) });
            chart.xAxis.axisLabel("date");
            chart.yAxis.tickFormat(d3.format(',.0f'));
            chart.y2Axis.tickFormat(d3.format(',.4f'));

            chart.legend.vers('furious');

            chart.legend.margin(margins);

            atleastOnePoint = false;

            d3.select('#' + chartName)
                .datum(data)
                .transition().duration(1000)
                .call(chart)
                .each('start', function() {
                    setTimeout(function() {
                        d3.selectAll('#' + chartName + ' *').each(function() {
                            if(this.__transition__)
                                this.__transition__.duration = 1;
                        })
                    }, 0)
                });

            nv.utils.windowResize(chart.update);

            charts_array[chartName] = chart_wrapper;
            chart.update();

            chart.dispatch.on('renderEnd', function(e) { chart_wrapper.refreshDataTable(); });

            return chart;
        });

    } catch(e) {
        $('#' + chartName).parent().text(e);
    }

}

最佳答案

我通过放弃 TZ 感知 API 并改用日期字符串解决了我的问题。

  • 服务器转换为所需的 TZ (EST) 并将结果作为日期字符串传递。
  • 客户端主要使用moment JS,从日期创建对象 带本地 TZ 的字符串。时间没有意义,我只用日期。
  • 时刻对象将转换为带有本地 TZ 集的 NVD3 的 JS 日期对象。
  • 为了获取仅日期的画笔范围,我将转换为时刻,然后将开始日期四舍五入到第二天(如果小于一天的开始)。我下降到地板上的结束日期。
  • 当使用新的日期范围调用服务器时,我会转换为日期字符串(恰好一直采用 EST)。

事实证明,这个解决方案比我之前尝试做的更容易遵循。

关于javascript - D3 时区偏移量移至前一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290845/

相关文章:

javascript - 如何使用 d3.js 访问 CSV 数据

javascript - 通过datepicker的日期参数获取FullCalendar中的资源

angularjs - Mongodb 节省了一天的时间 - 时区问题

javascript - 在回调函数中使用 for 循环执行动画

javascript - 在 D3.js 中隐藏不相关的父节点但子节点

linux - 如何在ubuntu终端中获取一天中的星期几

javascript - 我可以使用日期对象作为 JSON 对象 javascript 中的键吗?

javascript - 找出 4 个百分比之间的所有可能性

javascript - AngularJS - 双大括号导致语法错误

java - 将日期时间对象转换为字符串