Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.

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