Ошибка форматирования дат в nvd3

#javascript #d3.js #nvd3.js

#javascript #d3.js #nvd3.js

Вопрос:

Я показываю простую диаграмму с использованием nvd3, и я получаю NaN при форматировании из строковой даты. Когда я использую код с явными датами javascript (например, закомментируйте var testdata). график показан правильно. Вот мой код. Но я хотел бы использовать строки, что здесь не так?

 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link href="novus-nvd3-153163a/build/nv.d3.css" rel="stylesheet" type="text/css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.2/d3.min.js" charset="utf-8"></script>
    <script src="novus-nvd3-153163a/build/nv.d3.js"></script>
     <script src="novus-nvd3-153163a/examples/lib/stream_layers.js"></script>
    <style>
        text {
            font: 12px sans-serif;
        }
        svg {
            display: block;
        }
        html, body, {
            margin: 0px;
            padding: 0px;
            height: 100%;
            width: 100%;
        }
          #chart1 {
          width : 600px;
          height: 400px;
          }
    </style>
</head>
<body class='with-3d-shadow with-transitions'>
<div id="chart1" ><svg></svg></div>

<script>
    var dates = [new Date(2013,1,1).getTime(),  new Date(2014,1,1).getTime(), new Date(2015,1,1).getTime()];
    //var testdata = [{"key":"Sales","values":[{"x":dates[0],"y":2972948},{"x":dates[1],"y":2659151},{"x":dates[2],"y":11381859}]},{"key":"Rentability","values":[{"x":dates[0],"y":32.9},{"x":dates[1],"y":30.6},{"x":dates[2],"y":78.5}]}];
    var testdata = [{"key":"Sales","values":[{"x":"2013-1-1","y":2972948},{"x":"2014-1-1","y":2659151},{"x":"2015-1-1","y":11381859}]},{"key":"Rentability","values":[{"x":"2013-1-1","y":32.9},{"x":"2014-1-1","y":30.6},{"x":"2015-1-1","y":78.5}]}];
    testdata[0].type = "line";
    testdata[0].yAxis = 1;
    testdata[1].type = "line";
    testdata[1].yAxis = 2;

    nv.addGraph(function() {
        var chart = nv.models.multiChart()
            .margin({top: 30, right: 60, bottom: 50, left: 70})
            .color(d3.scale.category10().range());
        chart.xAxis.tickFormat(function(d) { 
            console.log(d);
            return d3.time.format('%Y')(new Date(d)); 
            });
        chart.xAxis.tickValues(dates);
        chart.yAxis1.tickFormat(d3.format(',.1f'));
        chart.yAxis2.tickFormat(d3.format(',.1f'));
        d3.select('#chart1 svg')
            .datum(testdata)
            .transition().duration(0).call(chart);
        return chart;
    });
</script>
</body>
</html>
 

Комментарии:

1. Пожалуйста, просмотрите свое описание. Закомментированная строка выглядит так, как будто она не будет работать, в то время как строка с датами Javascript не закомментирована.

2. Да, спасибо, я закомментировал другую строку.

Ответ №1:

К сожалению, AFAIK nv3d не поддерживает строки в качестве дат. Я столкнулся с той же проблемой несколько месяцев назад.

В основном я вижу здесь два возможных решения:

  1. Если JavaScript является вашим основным источником данных, используйте Date.parse() для преобразования ваших строк в даты JavaScript.
  2. В противном случае, при создании этого JavaScript на сервере, измените код сервера для отображения дат JavaScript.

Чтобы избежать проблем с часовыми поясами, вам следует внимательно прочитать Date.parse() документацию, например, здесь: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

Короче говоря, если вы передаете строки в формате ISO Date.parse() , вы получите значения UTC (если не указан часовой пояс). Это Date.parse("2012-03-02") может привести к 2012-03-01 23:00:00 или аналогичным эффектам при его визуализации (с использованием настроек вашего местного часового пояса, если вы не находитесь в часовом поясе GMT).

Комментарии:

1. Как ни странно, я уже использую nv3d со строкой в качестве дат в других примерах.

2. Хорошо, почему бы вам не опубликовать это в качестве рабочего примера и здесь? Помогло бы найти, что может быть не так… Насколько я помню, это может работать с некоторыми типами диаграмм, но с другими нет…

3. Это мультиархив, здесь принимаются строковые даты, как вы думаете, мультисхема отличается? Почему некоторые диаграммы будут работать, а другие нет, ведь даты синтаксического анализа не зависят от диаграмм. Я использую множество скриптов для рендеринга материала, я собираюсь создать работающую мультиархивную таблицу со строковыми датами, что займет время.

4. Я думаю, что диаграммы со скалярной осью имеют эту проблему. Диаграммы с различными значениями оси могли бы справиться с этим. Но это много предположений, так как я не работал с nvd3 в течение нескольких месяцев…

5. Я сдаюсь, я буду отправлять даты в миллисекундах, чтобы nv правильно интерпретировал. Тем не менее, нет удовлетворительного ответа на вопрос, почему строковые даты не работают на такого рода диаграммах.