2009-09-15 16 views

Respuesta

9

Puede pasar la fecha/hora como una marca de tiempo UNIX que es un número entero, un tipo de datos compatible nativamente en JSON. DateTime en PHP tiene una función "getTimestamp()" que le dará ese valor.

+4

Y perdería toda la información de la zona horaria. Definitivamente no es la respuesta aceptable en una aplicación de zona horaria plural. –

1

Respuesta corta: no.

JSON es solo texto, y todos los valores son matrices, objetos, números, cadenas, booleanos o nulo. El "objeto" en este caso es básicamente una matriz PHP, no puede tener métodos. Necesita convertir manualmente las fechas (que serán cadenas) en Fechas.

La definición formal de JSON es en http://www.json.org/

13

El objeto JavaScript Date JSON no es válida y que sólo se ve en la naturaleza debido a que una gran cantidad de personas analizar su JSON con un eval() en toda regla.

Una alternativa fácil y legible para los humanos sería enviar la fecha como una cadena en un formato compatible con Date.parse().

Su JSON:

{ 
    date: '<?php echo date("r", $myDate); ?>' 
} 

Tienes JavaScript:

var myDateObj = new Date(Date.parse(myJSON.date)); 

Fuente: http://json.org/ - Véase el recuadro de la derecha para obtener una lista de tipos de datos JSON válidos.

+0

Tenía la esperanza de que de alguna manera podría automatizar a través de 'json_encode' ya que tengo una gran matriz asociativa de los cuales sólo algunos valores (fechas' $ [i] [ "Inicio"] ') son fechas. – Eric

-8

¡Seguro! Uso:

var JSONWithDate = { 
    "Date": new Date(<?php echo date("Y, ").(date(n) - 1).date(", j") ?>) 
}; 

EDITAR: Agregar código de ejemplo.

Aquí está mi código y FUNCIONA.

<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: Haz que sea más como JSON.

Aquí está mi código 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> 

Se genera el código HTML siguiente:

<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> 

Cuando se ejecuta, muestra:

Tue Sep 15 2009 00:00:00 GMT-0600 (CST) 

Si usted puede pasar una cadena que se parecen a JavaScript objeto literal (sin utilizar variables dentro de ella), la cadena puede ser evaluada para convertirla en un objeto. Esto significa que puede usarlo como JSON.

Espero que esto ayude.

+2

Su ejemplo puede funcionar, pero es JavaScript y no JSON. –

+0

Lo siento por mi ignorante pero no veo qué significa "es JavaScript y no JSON". JSON es un tipo de objeto de JavaScript literal que, como evaluación, es estimulante. Vea mi edición (veo un código que lo hace parecer más a JSON) pero la idea es exactamente la misma. – NawaMan

+1

Consulte http://json.org/, donde puede encontrar la especificación completa. Una línea clave del resumen: "JSON es un formato de texto que es __completamente independiente del lenguaje__ pero utiliza convenciones que son familiares para los programadores de la familia C de idiomas, incluidos C, C++, C#, Java, _JavaScript_, Perl, Python y muchos otros." –

1

Aunque estoy de acuerdo con la respuesta de @postfuturist, existe una alternativa: expresión regular con azúcar sintáctico.

$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); 

que produciría:

string(32) "{"test":new Date(1385820141000)}" 

o

Object {test: Sat Nov 30 2013 14:02:21 GMT+0000 (GMT)} 

si los datos JSON era para ser manipulados en JavaScript.

Esto cubriría la mayoría de los casos de uso (tenga en cuenta que la marca de tiempo UNIX no tiene necesariamente 10 caracteres). Si se usa en producción, se debe usar azúcar más sintáctica para evitar el reemplazo accidental del valor.

Esto debe usarse solo cuando se inyecta JSON en el tiempo de carga de la página, en lugar de a través de XHR, p.

<html> 
<head> 
<script> 
var myData = <?=$json_data?>; 
</script> 
</head> 
<body> 
</body> 
</html> 
+0

Esto no sería válido JSON? Sin embargo, sería válido Javascript. Corrígeme si estoy equivocado –

Cuestiones relacionadas