Lavachart Datatable-> toJson предоставляет столбец f и столбец v для даты на оси x с другим часовым поясом - PullRequest
0 голосов
/ 20 сентября 2018

Версия: "khill / lavacharts": "3.1. *",

Контроллер предоставляет объект с датой углерода, и дата данных завершается, как показано ниже;

В коде PHP

  $dataTable = \Lava::DataTable();
    $formatter  = \Lava::DateFormat([
        'pattern' => 'MMM d, HH:mm',
        //'timeZone' => '', //same results without timezone parameter or with 'timeZone' => 2,
    ]);

  $DataTable->addDateColumn('closing hour', $formatter)
            ->addNumberColumn('closing price')
            ->addNumberColumn('product evaluation')
            ->setDateTimeFormat('Y-m-d H:i:s')
            ->setTimezone('UTC') ; //added but no effect

for (...){
           //$hour_start-->toIso8601String() ==  2018-09-07T17:00:00+00:00 6430.4420188271
            $dataTable->addRow([$hour_start->toDateTimeString(), $hourly_closing_price ,$hourly_value]);
}

 **return $dataTable->toJson();//added after answer of WhiteHat**
 Log::info(' dataTable '.$dataTable->toJson());

Однако, хотя зарегистрированный php json для datatable, как указано ниже, для каждой строки:

{"c": [{"v": "Date (2018,8,7,17), 0,0) "}, {" v ": 6430.442018827109} ...

В javascript после вызова ajax к моему контроллеру Laravel, полученное значение json ниже

{"c": [{"v": "2018-09-07T15: 00: 00.000Z", "f": "7 сентября, 17:00"}, {"v": 6430.442018827109}, {"v ": 0}]}.

Существует разница в 2 часа между столбцом f (моя дата UTC) и столбцом v (моя дата UTC минус 2 часа).

Я изменил местный часовой пояс браузера для проверки, но безрезультатно.Данные представлены в формате UTC, сервер - в формате UTC, часовой пояс установлен на UTC, но где-то на графике Google применяется разница в 2 часа.

Похоже, что сервер Google не считает даты, отправленные как время UTC, и изменяет значение v, сохраняя значение в формате f

С

  $formatter  = \Lava::DateFormat([
            'pattern' => 'MMM d, HH:mm',
            'timeZone' => 0,
        ]);

=> f и vстолбец в том же часовом поясе, но изменился, как если бы введенная дата была не UTC (но UTC + 2)

{"c": [{"v": "2018-09-07T15: 00: 00.000Z"," f ":" 7 сентября, 15:00 "}, {" v ": 6430.442018827109}, {" v ": 0}]}

Есть кто-нибудь подсказку?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Как объяснил WhiteHat, это проблема того, как мой браузер и googleChart интерпретируют как локальные даты json, содержащий Google dataTable с датами utc.

1) Что делает мой браузер с датой в виде:новая дата (2018,8,7,6,0,0):

console.log('time2 '+ new Date(2018,8,7,6,0,0)) ->Fri Sep 07 2018 06:00:00 GMT+0200 (Romance Daylight Time)

Что я хочу:

console.log('time1'+ new Date(Date.UTC(2018,8,7,6,0,0))) ->Fri Sep 07 2018 08:00:00 GMT+0200 (Romance Daylight Time)

см. пункт 2 для решения.

2) Мне нужно получить мою дату JSON UTC действительно в этом формате: новая Дата (2018,8,7,6,0,0)

При вызове JavaScript диаграммы Google изменяются полученные даты сервера (например: {"v": "Дата (2018,8,7,17,0,0)"}) в формате json с локальной датой в формате [{"v": "2018-09-07T15: 00: 00.000Z", "f ":" 7 сентября, 17:00 "}, поэтому мне нужно перехватить строковую дату, прежде чем она будет изменена

 var dataTable
$.getJSON('/chart', function (dataJson) {
   // dataTable dataJson on format : "v":"Date(2018,7,31,19,0,0)"
   dataTable = dataJson
   dataToLoad = $.extend(true,{},dataJson); //clone it as the object dataToLoad  will be modified by google chart when loaded per lava

   lava.loadData('chart', dataToLoad , function (data) {
         console.log('data'+JSON.stringify(dataToLoad )) //dataTable dates are put on format : "v":"2018-08-31T16:00:00.000Z","f":"Aug 31, 18:00"           
    });
})

use dataTable...

//To get the right timezone on my dates, i did something like:

  string_timestamp ; string_timestamp = datatable.data['rows'][item.row]['c'][0]['v'] //this is my received UTC date formatted as "Date(2018,8,7,17,0,0)" in dataTable 
  temp=(string_timestamp.replace("Date(","")).replace(")","")                          
  str1= temp.split(',');
  date2=new Date(Date.UTC(str1[0],str1[1],str1[2],str1[3],str1[4],str1[5])) 
0 голосов
/ 20 сентября 2018

Я не знаком с Lavacharts,
, но я бы поставил под сомнение формат данных, когда они на самом деле достигают браузера.
, действительно ли они в формате json.

не уверен, что addRow делает здесь, но, похоже, он загружает простой массив,
не объект json.

addRow([$hour_start->toDateTimeString(), $hourly_closing_price ,$hourly_value]);

в javascript, когда вы создаете дату из строки,
в большинстве случаев будет скорректирована для часового пояса.
см. Этот ответ для получения дополнительной информации.-> Почему Date.parse дает неверные результаты?

однако, в Google 101 * * представление строки даты json даст точную дату,
без настройкидля часового пояса.

посмотрите на следующий пример,
в первой строке, используется строка даты gson от json.
во второй, мы используем конструктор new Date() из форматированной строки.

вы заметите, что браузер не меняет часовой пояс в первой строке,
, но во второй.

google.charts.load('current', {
  packages: ['table']
}).then(function () {

  var data = new google.visualization.DataTable({
    cols: [
      {type: 'datetime'}
    ],
    rows: [
      {c:[{v: 'Date(2018,8,7,17,0,0)'}]},
      {c:[{v: new Date('2018-09-07T17:00:00+00:00')}]}
    ]
  });
  
  var formatDate = new google.visualization.DateFormat({
    pattern: 'MM/dd/yyyy HH:mm:ss'
  });
  formatDate.format(data, 0);
  
  var table = new google.visualization.Table(document.getElementById('table'));
  table.draw(data);
  
  document.getElementById('test-date0').innerHTML = data.getValue(0, 0);
  document.getElementById('test-date1').innerHTML = data.getValue(1, 0);

});
div {
  margin-bottom: 6px;
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div>Google table chart</div>
<div id="table"></div>
<div>raw data</div>
<div id="test-date0"></div>
<div id="test-date1"></div>

РЕДАКТИРОВАТЬ

одним из вариантов может быть использование представления данных для корректировки датыпо смещению часового пояса в браузере
это должно вернуть дату к исходному значению, отправленному с сервера ...

см. следующий рабочий фрагмент ...

google.charts.load('current', {
  packages: ['table']
}).then(function () {

  var data = new google.visualization.DataTable({
    cols: [
      {type: 'datetime'}
    ],
    rows: [
      {c:[{v: 'Date(2018,8,7,17,0,0)'}]},
      {c:[{v: new Date('2018-09-07T17:00:00+00:00')}]}
    ]
  });
  
  var formatDate = new google.visualization.DateFormat({
    pattern: 'MM/dd/yyyy HH:mm:ss'
  });

  // create data view
  var view = new google.visualization.DataView(data);
  view.setColumns([{
    calc: function (dt, row) {
      // one minute in milliseconds
      var oneMinute = (60 * 1000);

      // get date from data table
      var rowDate = dt.getValue(row, 0);

      // Adjust date for timezone
      rowDate = new Date(rowDate.getTime() + (oneMinute * rowDate.getTimezoneOffset()));

      // return new value and formatted value
      return {
        v: rowDate,
        f: formatDate.formatValue(rowDate)
      };
    },
    type: data.getColumnType(0)
  }]);

  var table = new google.visualization.Table(document.getElementById('table'));
  table.draw(view);
  
  document.getElementById('test-date0').innerHTML = view.getValue(0, 0);
  document.getElementById('test-date1').innerHTML = view.getValue(1, 0);

});
div {
  margin-bottom: 6px;
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div>Google table chart</div>
<div id="table"></div>
<div>raw data</div>
<div id="test-date0"></div>
<div id="test-date1"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...