2016-10-27 133 views
0

以某種方式可以更改json_encode(['date' => $dateTimeObj])的輸出嗎?在json_encode中更改DateTime的輸出

現在它打印

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

我想有這樣

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

我最初的想法輸出是創造這將延長日期時間我自己的DateTime類,並覆蓋jsonSerialize,但日期時間做沒有實現JsonSerializable接口,__toString也沒有幫助。

我正在使用PHP 7.0.8。

我的意思是這樣的

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

此代碼現在輸出

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

我想有

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

'json_encode()'不處理你給它的任何數據。如果將日期放入對象/數組中,則按照您想要查看的方式對其進行編碼,但它會保持這種狀態。因此,修復添加日期的代碼 – RiggsFolly

+0

基本上...在'json_encode'之前手動將日期格式化爲字符串。 – deceze

+0

@deceze是的,這可能是唯一的方法。我必須爲文章,評論,主題等等返回日期......所以我認爲可以在某個地方以某種方式自動轉換它。 – LiTe

回答

3

改變一些細節之後,特別是接口名稱,您的代碼在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,對我很恥辱。謝謝! – LiTe