PHP date () для JavaScript new Data () – Внутренний массив

Примечание. Это следующий вопрос к предыдущей почте .

У меня есть PHP-массив, который мне нужно разобрать на JavaScript. В настоящее время я <?php echo json_encode($array_name)?> сделать это, используя <?php echo json_encode($array_name)?> Внутри JavaScript. Для большинства данных в массиве это отлично работает, за исключением дат. Массив, который я пытаюсь выполнить, выглядит следующим образом:

 $timeData = array( array('1', 'Some task', date('2015-04-09'), date('2015-04-23')), array('2', 'Another task', date('2015-04-13'), date('2015-04-20')), array('3', 'A different task', date('2015-04-16'), date('2015-04-30)) ); ?> 

Мне нужно проанализировать этот массив таким образом, чтобы его можно было использовать в графике диаграмм Google , где функция выглядит так (см. Комментарий в коде):

 <script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization', 'version':'1','packages':['timeline']}]}"></script> <script type="text/javascript"> google.setOnLoadCallback(drawChart); function drawChart() { var container = document.getElementById('example2.1'); var chart = new google.visualization.Timeline(container); var dataTable = new google.visualization.DataTable(); dataTable.addColumn({ type: 'string', id: 'Term' }); dataTable.addColumn({ type: 'string', id: 'Name' }); dataTable.addColumn({ type: 'date', id: 'Start' }); dataTable.addColumn({ type: 'date', id: 'End' }); // This is the part I would like to replace with the PHP array dataTable.addRows([ [ '1', 'George Washington', new Date(1789, 3, 29), new Date(1797, 2, 3) ], [ '2', 'John Adams', new Date(1797, 2, 3), new Date(1801, 2, 3) ], [ '3', 'Thomas Jefferson', new Date(1801, 2, 3), new Date(1809, 2, 3) ]]); chart.draw(dataTable); } </script> 

Я попробовал несколько разных способов создания дат в массиве PHP, включая new Date() и new DateTime() , без везения. Мой последний вариант – разбить массив на части, прежде чем разбирать данные. Однако это кажется несколько глупым, поскольку оно должно быть объединено как массив снова внутри JavaScript. Есть ли способ записать даты в массиве PHP, чтобы они работали при анализе в JavaScript?

На стороне PHP вы можете вернуть временную метку, чтобы ее легче обрабатывать в JavaScript:

 <?php $timeData = array( array('1', 'Some task', DateTime::createFromFormat('Ym-d', date('2015-04-09'))->format('U')*1000, DateTime::createFromFormat('Ym-d', date('2015-04-23'))->format('U')*1000, array('2', 'Another task', DateTime::createFromFormat('Ym-d', date('2015-04-09'))->format('U')*1000, DateTime::createFromFormat('Ym-d', date('2015-04-20'))->format('U')*1000, array('3', 'A different task', DateTime::createFromFormat('Ym-d', date('2015-04-16'))->format('U')*1000, DateTime::createFromFormat('Ym-d', date('2015-04-30'))->format('U')*1000 ); ?> 

Для части JavaScript вы можете просмотреть результат, чтобы добавить строки:

 /* Assuming rows contains a valid JS array with dates expressed as timestamps in milliseconds rows = [ [1, "Some task", 1428570428000, 1429780165000], [2, "Another task", 1428570428000, 1429520977000], [3, "A different task", 1429175344000, 1430384993000] ]; */ for (var i = 0; i < rows.length; i++) { dataTable.addRow( rows[i][0], rows[i][1], new Date(rows[i][2]), new Date(rows[i][3]), ); } 

Также можно отправить дату в виде строки в соответствии с документацией Google Даты и времена, используя представление строки даты . Таким образом, вы также можете вернуть это из PHP (обратите внимание, что в JS месяцы нулевые индексируются):

 <?php $timeData = array( array('1', 'Some task', "Date(2015, 3, 9, 0, 0, 0, 0)", "Date(2015, 3, 23, 0, 0, 0, 0)", array('2', 'Another task', "Date(2015, 3, 9, 0, 0, 0, 0)", "Date(2015, 3, 20, 0, 0, 0, 0)", array('3', 'A different task', "Date(2015, 3, 16, 0, 0, 0, 0)", "Date(2015, 3, 30, 0, 0, 0, 0)" ); ?> 

И в JS просто так:

 /* Assuming rows contains a valid JS array with dates expressed as strings rows = [ [1, "Some task", "Date(2015, 3, 9, 0, 0, 0, 0)", "Date(2015, 3, 23, 0, 0, 0, 0)"], [2, "Another task", "Date(2015, 3, 9, 0, 0, 0, 0)", "Date(2015, 3, 20, 0, 0, 0, 0)"], [3, "A different task", "Date(2015, 3, 16, 0, 0, 0, 0)", "Date(2015, 3, 30, 0, 0, 0, 0)"] ]; */ dataTable.addRows(rows); 

вы не можете передать этот формат в конструктор даты. Попробуйте таким образом:

 var parts = mydate.split('-'); var mydateparsed = new Date(parts[0],parts[1],parts[2]); 

Надеюсь, это будет полезно для вас.

С уважением