1

我有从数据库返回这个的 php 代码,

[
{
    "Time": "2012-11-27 16:10:35",
    "NumPlayers": "1"
},
{
    "Time": "2012-11-27 16:24:55",
    "NumPlayers": "1"
},
{
    "Time": "2012-11-27 16:25:37",
    "NumPlayers": "2"
},
{
    "Time": "2012-11-27 16:29:33",
    "NumPlayers": "2"

时间是 MySQL 时间戳。我需要把它变成这种格式才能与 Highcharts javascript 图表一起使用。

data: [
[Date.UTC(1970,  9,  9), 0   ],
[Date.UTC(1970,  9, 14), 0.15],
[Date.UTC(1970, 10, 28), 0.35],
[Date.UTC(1970, 11, 12), 0.46],

我无法弄清楚如何遍历 MySQL 结果并将时间戳转换为 javascript Date.UTC 对象。我需要将 NumPlayers 值放在 Date.UTC 对象之后,并以下面的格式输出。我是 PHP 和 javascript 菜鸟:\

它应该看起来像这样:

data: [
[Date.UTC(2012, 11, 27, 16, 10, 35), 1],
[Date.UTC(2012, 11, 27, 16, 24, 55), 1],
[Date.UTC(2012, 11, 27, 16, 25, 37), 2],
[Date.UTC(2012, 11, 27, 16, 29, 33), 2],
4

5 回答 5

2

您应该意识到这Date.UTC(2012, 11, 27, 16, 10, 35)只是返回自 epoch ( 1356624635000) 以来的毫秒数。因此,您可以将对象转换为 UNIX 时间戳(1000 倍,因为 JS 使用毫秒时间戳,但 PHP 使用秒)。

示例代码

$data = '[{"Time": "2012-11-27 16:10:35", "NumPlayers": "1"}, {"Time": "2012-11-27 16:24:55", "NumPlayers": "1"}]';

// Make sure date is parsed as UTC
date_default_timezone_set("UTC");

// Convert items into the desired format
$mapper = function($item) {
    return array(strtotime($item->Time)*1000, $item->NumPlayers);
}

echo json_encode(array_map($mapper, json_decode($data)));

输出

[[1354032635000,"1"],[1354033495000,"1"]]
于 2012-12-04T19:05:56.330 回答
1

您似乎直接从数据库中获取 JSON,您可以随时将其转换为数组:

$data = '[{"Time": "2012-11-27 16:10:35", "NumPlayers": "1"}, {"Time": "2012-11-27 16:24:55", "NumPlayers": "1"}]';
$arrayData = json_decode($data, true);

之后,您可以简单地遍历数组并以您需要的 JS 格式打印出数组的内容。像这样的东西:

echo 'data: [' . PHP_EOL;
foreach ($arrayData as $item) {
    echo '[Date.UTC(';
    $tmp = preg_split( '/(-| |\:)/', $item['Time'] );
    echo implode(', ', $tmp);
    echo '), ' . $item['NumPlayers'] . '],';
    echo PHP_EOL;
}
echo PHP_EOL . '];';
于 2012-12-04T17:56:18.803 回答
1

向 Highcharts 提供数据的最佳方式是从数据库中获取格式化的数据,这样您就不必在客户端执行此操作。

为此,您只需将您的更改query为以下内容。

后端
$query = "SELECT UNIX_TIMESTAMP(date) * 1000 AS 'date', value FROM ...";

然后将结果发送到前端:
echo json_encode($result);

前端
要在前端获取结果,本例使用 jQuery 并假设这url是您的 url:

$.getJSON(url, function(json) {
    // decode json
    var data = $.parseJSON(json);
    // Then you just have to pass it to your series
});

或者更好的是,将日期值存储为 UTC。

于 2012-12-04T23:42:15.987 回答
1

您可以使用以下方法将时间字符串拆分/[^\d]+/g为多个部分:

var finalData = [], numbers=/[^\d]+/g, item, dateParts, newDate;
for (var i=0, l=data.length; i<l; i++) {
     item = data[i];
     dateParts = item.Time.split(numbers);
     newDate = Date.UTC.apply(Date, dateParts);
     finalData.push([newDate, item.NumPlayers]);
}

另请参阅:MDN 关于 JavaScript 正则表达式的文档/[^\d]/g是一个正则表达式)。

于 2012-12-04T18:00:34.150 回答
0
    var php_data = [
        {
            "Time": "2012-11-27 16:10:35",
            "NumPlayers": "1"
        },
        {
            "Time": "2012-11-27 16:24:55",
            "NumPlayers": "1"
        }
    ];

    var length = php_data.length;
    hc_data = [];

    for(var i = 0; i< length; i++){
      php_date = new Date(php_data[i]["Time"]);
      hc_data.push(
        [
            Date.UTC(
                php_date.getFullYear(), 
                php_date.getMonth() + 1, 
                php_date.getDate()
            ),
            php_data[i]["NumPlayers"]
        ]
      );
    }

    // hc_data is your Array
于 2012-12-04T18:09:42.967 回答