是否有一种方法可以在PHP中创建一个包含javascript date
对象的JSON对象?json_encode
会自动将PHP的DateTime
转换为Javascript的date
吗?
是否有一种方法可以在PHP中创建一个包含javascript date
对象的JSON对象?json_encode
会自动将PHP的DateTime
转换为Javascript的date
吗?
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数据类型。
虽然我同意@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)}
<html>
<head>
<script>
var myData = <?=$json_data?>;
</script>
</head>
<body>
</body>
</html>
简短回答:不行。
JSON只是文本,所有的值都是数组、对象、数字、字符串、布尔或null。在这种情况下,“对象”基本上只是一个PHP数组——它不能有方法。您需要手动将日期(将是字符串)转换为日期。
JSON的正式定义在http://www.json.org/。
当然可以!使用:
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>
<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)
eval
,这既慢又不安全——正确的用法应该是JSON.parse(string),它更快,并且实际上没有eval
中存在的许多安全漏洞。 - olliej
json_encode
来自动化处理它,因为我有一个很大的关联数组,其中只有一些值($dates[i]["start"]
)是日期。 - Eric