2016-10-27 3 views
0

Est-il possible de modifier la sortie de json_encode(['date' => $dateTimeObj])?Modifier la sortie de DateTime dans json_encode

Maintenant, il imprime

{ 
    "date": { 
     "date": "2016-10-27 11:23:52.000000", 
     "timezone_type": 3, 
     "timezone": "Europe/Paris"  
    } 
} 

Je voudrais avoir une sortie comme ce

{ 
    "date": "2016-10-27T11:23:52+00:00" 
} 

Ma première idée était de créer ma propre classe DateTime qui sera étend DateTime et passer outre jsonSerialize, mais DateTime-t pas implémenter l'interface JsonSerializable et __toString n'a pas aidé aussi.

J'utilise PHP 7.0.8.

je voulais dire quelque chose comme ça

<?php  
MyDateTime extends \DateTime implements jsonSerialize 
{ 
    public function jsonSerialize() // this is never called 
    { 
     return $this->format("c"); 
    } 
} 

$datetime = new MyDatetime(); 

$output = [ 
    'date' => $datetime; // want to avoid $datetime->format("c") or something like this everywhere 
]; 

json_encode($output); 

Ce code maintenant sortie

{ 
    "date": { 
     "date": "2016-10-27 11:23:52.000000", 
     "timezone_type": 3, 
     "timezone": "Europe/Paris"  
    } 
} 

Je voudrais avoir

{ 
    "date": "2016-10-27T11:23:52+00:00" 
} 
+0

'json_encode()' ne manipule aucune donnée que vous lui fournissez. Si vous mettez la date dans l'objet/tableau que vous encodez comme vous voulez le voir, cela restera comme ça. Donc, corrigez le code qui ajoute la date – RiggsFolly

+0

Fondamentalement ... formatez manuellement la date en une chaîne avant de l'insérer dans json_encode. – deceze

+0

@deceze oui, c'est probablement le seul moyen. Je dois retourner la date pour les articles, les commentaires, les discussions ... et plus encore ... J'ai donc pensé qu'il serait possible de le convertir automatiquement d'une manière ou d'une autre. – LiTe

Répondre

3

Après avoir changé quelques détails, notamment le nom de l'interface, Votre code fonctionne très bien pour moi sur PHP 7.0.14.

<?php 

class MyDateTime extends \DateTime implements \JsonSerializable 
{ 
    public function jsonSerialize() 
    { 
     return $this->format("c"); 
    } 
} 

$datetime = new MyDatetime(); 

$output = [ 
    'date' => $datetime, 
]; 

echo json_encode($output); 
// Outputs: {"date":"2017-02-12T17:34:36+00:00"} 
+0

OMG, honte à moi. Je vous remercie! – LiTe