Может ли объект JSON, возвращаемый PHP, содержать объект даты - PullRequest
15 голосов
/ 15 сентября 2009

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

Ответы [ 5 ]

13 голосов
/ 15 сентября 2009

Объект 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.

9 голосов
/ 15 сентября 2009

Вы можете передать дату / время как метку времени UNIX, которая является целым числом, изначально поддерживаемым типом данных в JSON. DateTime в PHP имеет функцию "getTimestamp ()", которая даст вам это значение.

1 голос
/ 30 ноября 2013

Хотя я согласен с ответом @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>
1 голос
/ 15 сентября 2009

Краткий ответ: нет.

JSON - это просто текст, а все значения - это массивы, объекты, числа, строки, логические значения или ноль. «Объект» в этом случае - это просто массив PHP - у него не может быть методов. Вам необходимо вручную преобразовать даты (которые будут строками) в даты.

Формальное определение JSON: http://www.json.org/

0 голосов
/ 15 сентября 2009

Конечно! Использование:

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 (без использования переменной внутри него), строку можно преобразовать в объект. Это означает, что вы можете использовать его как JSON.

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

...