Есть ли способ создать объект JSON в PHP, который содержит объект date
javascript? json_encode
ли json_encode
автоматически преобразовывать date
DateTime
PHP в Javascript?
Вы можете передать дату / время как временную метку UNIX, которая является целым числом, родным типом данных в JSON. DateTime в PHP имеет функцию getTimestamp (), которая даст вам это значение.
Объект Date
JavaScript недействителен 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.
Короткий ответ: нет.
JSON – это просто текст, и все значения – это массивы, объекты, числа, строки, логические значения или нуль. «Объект» в этом случае является в основном просто массивом PHP – он не может иметь методы. Вам нужно вручную преобразовать даты (которые будут строки) в Даты.
Официальное определение JSON находится по адресу http://www.json.org/
Хотя я согласен с ответом @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>
Конечно! Использование:
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.
Надеюсь это поможет.