Есть ли способ создать объект JSON в PHP, который содержит объект javascript date
? json_encode
автоматически преобразует PHP DateTime
в Javascript date
?
Может ли объект JSON, возвращаемый PHP, содержать объект даты
Ответ 1
Вы можете передать дату/время как временную метку UNIX, которая является целым числом, родным типом данных в JSON. DateTime в PHP имеет функцию getTimestamp(), которая даст вам это значение.
Ответ 2
Объект JavaScript Date
недействителен JSON и виден только в дикой природе, потому что многие люди разбирают свой JSON с полномасштабным eval()
.
Легкой, удобной для человека альтернативой было бы отправить дату в виде строки в формате, поддерживаемом Date.parse()
.
Ваш JSON:
{
date: '<?php echo date("r", $myDate); ?>'
}
Ваш JavaScript:
var myDateObj = new Date(Date.parse(myJSON.date));
Источник: http://json.org/ - См. поле справа для списка допустимых типов данных JSON.
Ответ 3
Короткий ответ: нет.
JSON - это просто текст, и все значения - это массивы, объекты, числа, строки, логические значения или нуль. "Объект" в этом случае является в основном просто массивом PHP - он не может иметь методы. Вам нужно вручную преобразовать даты (которые будут строки) в Даты.
Формальное определение JSON находится в http://www.json.org/
Ответ 4
Пока я согласен с ответом @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)}
если данные JSON должны обрабатываться в JavaScript.
Это будет охватывать большинство случаев использования (обратите внимание, что временная метка UNIX не обязательно должна содержать 10 символов). При использовании в производстве следует использовать более синтаксический сахар, чтобы предотвратить случайную замену значения.
Это должно использоваться только тогда, когда JSON вводится на время загрузки страницы, а не через XHR, например
<html>
<head>
<script>
var myData = <?=$json_data?>;
</script>
</head>
<body>
</body>
</html>
Ответ 5
Конечно! Использование:
var JSONWithDate = {
"Date": new Date(<?php echo date("Y, ").(date(n) - 1).date(", j") ?>)
};
EDIT: добавьте пример кода.
Вот мой код и он РАБОТАЕТ.
<html>
<body>
<script>
var J = { "Date": new Date(<?php echo date("Y, ").(date("n") - 1).date(", j") ?>) }
document.write(J["Date"]);
</script>
</body>
</html>
EDIT 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 (без использования переменной внутри него), строка может быть указана для обращения к объекту. Это означает, что вы можете использовать его как JSON.
Надеюсь, что это поможет.