2016-10-27 5 views
0

Ist es irgendwie möglich, die Ausgabe von json_encode(['date' => $dateTimeObj]) zu ändern?Ändern der Ausgabe von DateTime in json_encode

Jetzt druckt er

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

Ich möchte ausgegeben haben wie diese

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

Meine erste Idee war meine eigene Datetime-Klasse zu schaffen, wird Datetime erweitert und außer Kraft setzen jsonSerialize, aber Datetime tut nicht implementieren JsonSerializable-Schnittstelle und __toString hat auch nicht geholfen.

Ich benutze PHP 7.0.8.

ich so etwas wie dies bedeutete

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

Dieser Code jetzt Ausgabe

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

I

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

'json_encode()' manipuliert keine Daten, die Sie ihm geben. Wenn Sie das Datum in das Objekt/Array setzen, das Sie so kodieren, wie Sie es sehen wollen, bleibt es so. So beheben Sie den Code, der das Datum hinzufügt – RiggsFolly

+0

Grundsätzlich ... formatieren Sie das Datum manuell in eine Zeichenfolge, bevor Sie es "json_encode" es. – deceze

+0

@deceze ja, es ist wahrscheinlich der einzige Weg. Ich muss das Datum für Artikel, Kommentare, Themen und mehr ... zurückgeben. Also dachte ich, es wird möglich sein, es irgendwie automatisch an einem Ort zu konvertieren. – LiTe

Antwort

3

Nach dem Wechsel ein paar Details, insbesondere die Schnittstellennamen haben möchten, Ihr Code funktioniert gut für 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, Schande über mich. Vielen Dank! – LiTe