Может ли объект JSON, возвращаемый PHP, содержать объект даты

Есть ли способ создать объект JSON в PHP, который содержит объект date javascript? json_encode ли json_encode автоматически преобразовывать date DateTime PHP в Javascript?

Related of "Может ли объект JSON, возвращаемый PHP, содержать объект даты"

Вы можете передать дату / время как временную метку 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.

Надеюсь это поможет.