【问题标题】:Turning JSON into date object将 JSON 转换为日期对象
【发布时间】:2016-06-07 15:28:51
【问题描述】:

我在这里收到请求

$http.get('php/getactivity.php')
    .then(
        function (response) {
            $scope.data.activities = response.data;
        },
        function (response) {
          // error handling
        }
    );

从数据库中获取数据。在我的 php 中

<?php 
include('dbconnect.php');

$result = $conn->query("SELECT * FROM Activities WHERE EventID =1;");

$outp = "";

while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    if ($outp != "") {
        $outp .= ",";
    }       
    $outp .= '{"ActivityDate":"'  . $rs["ActivityDate"] . '",';     
    $outp .= '"StartTime":"'  . $rs["StartTime"] . '",';        
    $outp .= '"EndTime":"'  . $rs["EndTime"] . '"}';
}   
$outp ='['.$outp.']';
$conn->close();

echo($outp);
?>

从数据库中获取日期字符串。数据示例如下:

1970 年 1 月 1 日星期四 11:11:00 GMT+0800(马来半岛标准时间)

因为我使用ng-repeat{{ActivityDate||date:"dd/MM/yyyy"}} 访问数据以使其显示在视图中,所以我无法使用new Date() 手动将其转换为日期对象。

我已尝试将新日期添加到这样生成的 json 中,但它不起作用:

$outp .= '"ActivityDate": new Date("'. $rs["ActivityDate"] . '"),';

正确的做法是什么?

【问题讨论】:

  • 问题是“Turning JSON into date object”,json代码在哪里?
  • 不要将字符串混合在一起以生成 JSON。 PHP 有json_encode 函数。
  • 您正在输出 JSON,但您忘记包含 header("Content-Type: application/json");,因此您的 PHP 将报告它是 HTML 而不是 JSON。
  • 您正在手动构建 json。不要那样做。您的任何错误都会将整个 json 块视为无效。构建一个 php 结构,然后在其上执行单个 echo json_encode(...)
  • 您不能将 Date 放入 JSON。 JSON 规范对此一无所知。您应该在客户端将时间戳之类的内容转换为日期。

标签: php angularjs json date


【解决方案1】:

在服务器端格式化日期可能是最简单的,按照您希望它在客户端上显示的方式。

一个选项:

date('d/m/Y', strtotime($rs["ActivityDate"]));

这是一个例子:https://3v4l.org/6Xv03

旁注:我建议您更改生成 JSON 的方式。先建一个 PHP 数组,然后再json_encode 它。这将避免潜在的 JSON 格式问题。

类似:

$output = [];
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    $output[] = [
        "ActivityDate" => date('d/m/Y', strtotime($rs["ActivityDate"])),
        "StartTime" => $rs["StartTime"],
        "EndTime" => $rs["EndTime"]
    ];
}   

$conn->close();

echo(json_encode($output));

然后正如一位评论者所说,添加标题以指示您的内容类型会有所帮助:

header("Content-Type: application/json");
echo(json_encode($output));

【讨论】:

  • 当有(马来半岛标准时间)时,转换日期是否为 01/01/1970?
  • 您的日期字符串是“1970 年 1 月 1 日”。无论时区如何,将其格式化为 d/m/Y 将导致“01/01/1970”。你希望它是什么?我们不会在这里将其转换为不同的时区。
  • 对不起,忘了说我用了不同的日期。 3v4l.org/DuvX7
  • 您不能包含该括号文本,这使其成为无效的日期字符串。这有效:3v4l.org/3vRMQ
  • 如果您需要去掉括号内的文字,这里有一种方法:3v4l.org/GL8V3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多