从PHP返回DateTime到JS的好做法

Good practice to return DateTime from PHP to JS

本文关键字:JS PHP 返回 DateTime      更新时间:2023-09-26

我已经创建了文件api.php

<?php
// Prevent caching.
header('Cache-Control: no-cache, must-revalidate');
// The JSON standard MIME header.
header('Content-type: application/json');   
//mssql_select_db("**", mssql_connect(**));
$conn=mssql_connect(***);    
$query = "SELECT ROUND([AirTemp_C],1) as [T]
                ,[DT]
            FROM [ASUTP].[dbo].[Temperature_ER]
            WHERE [Place] = 'ER06' AND [DT] > '26.05.2015 11:00'";
$qwr_res = mssql_query($query);
while ($row=mssql_fetch_array($qwr_res))
{
    $temps[] = array (
        'x' => $row['DT'],
        'y' => $row['T']
                );
}
echo json_encode($temps);   
?>

它返回JSON,如[{"x":"2015-05-26 11:02:04","y":26.3}]与我的测量值。

我想使用canvasjs-1.6.2使用这些数据绘制图形。这是我的代码:窗口。Onload = function () {

    $.getJSON("api.php",function(data1)
                        {                               
                            var chart = new CanvasJS.Chart("chartContainer",
                            {
                                title:{
                                    text: "Title",
                                    fontSize: 30
                                },
                                animationEnabled: true,
                                zoomEnabled:true,
                                height: 500,
                                axisX:{
                                    gridColor: "Silver",
                                    tickColor: "silver",
                                    labelAngle: -80,
                                    valueFormatString: "DD.MM HH:mm"
                                },                        
                                            toolTip:{
                                            shared:true
                                            },
                                theme: "theme2",
                                axisY: {
                                    gridColor: "Silver",
                                    tickColor: "silver"
                                },
                                legend:{
                                    verticalAlign: "center",
                                    horizontalAlign: "right"
                                },
                                data: [
                                {        
                                    type: "line",
                                    showInLegend: true,
                                    lineThickness: 2,
                                    name: "T",
                                    //markerType: "square",
                                    color: "#F08080",
                                    dataPoints: data1
                                }
                                ],
                            legend:{
                                cursor:"pointer",
                                itemclick:function(e){
                                if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
                                    e.dataSeries.visible = false;
                                }
                                else{
                                    e.dataSeries.visible = true;
                                }
                                chart.render();
                                }
                            }
                            });
                            chart.render();
                        });

但似乎这个图表(或JS)不能使用我的日期值作为一个正确的日期时间,所以图表不能渲染。

我已经修复了这个问题的循环:

for(var i=0;i<data1.length;i++)
{
   data1[i].x = new Date(data1[i].x);
}

我应该注意到我使用的是PHP 5.2,我不允许升级它。所以我的问题是:

  1. 是我的方式获得数据图表通过api.php正确吗?
  2. 有没有一种方法通过正确的DateTime值从php到JS没有循环转换?

如评论中所述,最可靠的跨浏览器传输日期的方法是使用时间值。UNIX时间值从1970-01-01T00:00:00Z开始以秒为单位。Javascript时间值来自同一纪元,但使用毫秒,因此您只需将UNIX时间值乘以1000并直接传递给Date构造函数。

JSON可能是这样的:

'[{x:"1432788147300", y:26.3}]'
如果x值被读入名为unixTimeValue的变量中,代码将是这样的:
var javascriptDate = new Date(unixTimeValue * 1000);

然而,如果你不能这样做,你可以相当容易地解析像'2015-05-26 11:02:04'这样的字符串。假设日期是UTC,您可以使用 date。UTC转换为日期对象:

function parseISOUTC(s) {
  var b = s.split(/'D/);
  return new Date(Date.UTC(b[0],b[1],b[2],b[3],b[4],b[5]));
}