在json_encode中更改DateTime的输出

LiT*_*iTe 1 php datetime json

以某种方式可以改变输出json_encode(['date' => $dateTimeObj])

现在它打印

{
    "date": {
        "date": "2016-10-27 11:23:52.000000",
        "timezone_type": 3,
        "timezone": "Europe/Paris"    
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望有这样的输出

{
    "date": "2016-10-27T11:23:52+00:00"
}
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是创建我自己的DateTime类,它将扩展DateTime并覆盖jsonSerialize,但DateTime没有实现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);
Run Code Online (Sandbox Code Playgroud)

此代码现在输出

{
    "date": {
        "date": "2016-10-27 11:23:52.000000",
        "timezone_type": 3,
        "timezone": "Europe/Paris"    
    }
}
Run Code Online (Sandbox Code Playgroud)

我想拥有

{
    "date": "2016-10-27T11:23:52+00:00"
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*tor 12

在更改了一些细节,特别是接口名称之后,您的代码在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"}
Run Code Online (Sandbox Code Playgroud)

  • 天啊,我真丢脸。谢谢你! (2认同)