PHP返回的JSON对象是否可以包含日期对象?

16

是否有一种方法可以在PHP中创建一个包含javascript date对象的JSON对象?json_encode会自动将PHP的DateTime转换为Javascript的date吗?

5个回答

13

JavaScript的Date对象不是有效的JSON格式,之所以有很多人在使用是因为他们用完整的eval()来解析JSON。

一个简单易懂的替代方法是将日期作为字符串发送,字符串应该以Date.parse()支持的格式为标准。

你的JSON:

{
    date: '<?php echo date("r", $myDate); ?>'
}

你的 JavaScript:

var myDateObj = new Date(Date.parse(myJSON.date));

来源:http://json.org/ - 右侧的框列出了有效的JSON数据类型。


我希望能够通过json_encode来自动化处理它,因为我有一个很大的关联数组,其中只有一些值($dates[i]["start"])是日期。 - Eric

9
您可以将日期/时间作为UNIX时间戳传递,这是JSON中本地支持的数据类型之一。PHP中的DateTime有一个“getTimestamp()”函数,可以提供该值。请注意保留HTML标记。

4
你将失去所有的时区信息。在一个涉及多个时区的应用中,这绝对不是可以接受的答案。 - i.am.michiel

1

虽然我同意@postfuturist的答案,但还有一种替代方案:使用带有语法糖的正则表达式。

$json_data = json_encode(['test' => '__' . $_SERVER['REQUEST_TIME']]);

$json_data = preg_replace_callback('/"__([0-9]{10})"/u', function ($e) {
    return 'new Date(' . ($e[1] * 1000) . ')';
}, $json_data);

会产生以下结果:

string(32) "{"test":new Date(1385820141000)}"

或者

Object {test: Sat Nov 30 2013 14:02:21 GMT+0000 (GMT)}

如果要在JavaScript中处理JSON数据,这将涵盖大部分用例(请注意UNIX时间戳不一定为10个字符长)。如果在生产环境中使用,应使用更多的语法糖以防止意外替换值。仅当在页面加载时注入JSON而不是通过XHR时才应使用此方法。
<html>
<head>
<script>
var myData = <?=$json_data?>;
</script>
</head>
<body>
</body>
</html>

这不是有效的JSON格式?但它是有效的Javascript代码。如果我错了,请指出来。 - Jack B

1

简短回答:不行。

JSON只是文本,所有的值都是数组、对象、数字、字符串、布尔或null。在这种情况下,“对象”基本上只是一个PHP数组——它不能有方法。您需要手动将日期(将是字符串)转换为日期。

JSON的正式定义在http://www.json.org/


-8

当然可以!使用:

var JSONWithDate = {
    "Date": new Date(<?php echo date("Y, ").(date(n) - 1).date(", j") ?>)
};

编辑:添加代码示例。

这是我的代码,它可以正常工作。

<html>
<body>
<script>
var J = { "Date": new Date(<?php echo date("Y, ").(date("n") - 1).date(", j") ?>) }
document.write(J["Date"]);
</script>
</body>
</html>

编辑 2:让它更像 JSON。

这是我的 PHP 代码。

<html>
<body>
<script>
<?php
function GetJSONDate($FieldName = "Date") {
    return "\"$FieldName\": new Date(".date("Y, ").(date("n") - 1).date(", j").")";
}
?>

function PrintJSONFromPHP(pJSONStr) {
    var aJSONObj = eval('('+pJSONStr+')');
    document.write(aJSONObj["Date"]);
}

var aJSONStr = '{ <?php echo GetJSONDate($FieldName = "Date"); ?> }';
PrintJSONFromPHP(aJSONStr);
</script>
</body>
</html>

它生成以下HTML代码:
<html>
<body>
<script>
function PrintJSONFromPHP(pJSONStr) {
    var aJSONObj = eval('('+pJSONStr+')');
    document.write(aJSONObj["Date"]);
}

var aJSONStr = '{ "Date": new Date(2009, 8, 15) }';
PrintJSONFromPHP(aJSONStr);
</script>
</body>
</html>

运行时,它显示:

Tue Sep 15 2009 00:00:00 GMT-0600 (CST) 

如果您可以传递一个看起来像JavaScript对象字面量的字符串(不使用其中的变量),则该字符串可以被eval解析为一个对象。这意味着您可以将其用作JSON。
希望这可以帮助到您。

抱歉我的无知,但我不明白“它是JavaScript而不是JSON”的意思。JSON是一种JavaScript对象字面量,可以将其作为字符串进行评估。请查看我的编辑(我看到了一个使其更像JSON的代码),但是想法完全相同。 - NawaMan
1
请参考 http://json.org/ 查看完整的规范。从总结中可以看出:“JSON 是一种文本格式,__完全独立于编程语言__,但使用了 C 语言家族(包括 C、C++、C#、Java、_JavaScript_、Perl、Python 等)程序员熟悉的约定。” - Alex Barrett
1
正如上面的人所说,JSON不是JavaScript——它是JS语法的一个子集,不允许任何非文字表达式。你的例子之所以能够工作,是因为你使用了eval,这既慢又不安全——正确的用法应该是JSON.parse(string),它更快,并且实际上没有eval中存在的许多安全漏洞。 - olliej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接