Symfony-JMS序列化器-序列化时将日期时间转换为特定时区

时间:2019-03-04 16:04:39

标签: symfony datetime timezone jmsserializerbundle

我有一个存储日期时间的实体,并且我使用JMSSerializer以便通过API返回此字段:

/**
 * @ORM\Column(type="datetime")
 *
 * @Serializer\Type("DateTime<'d/m - H:i', 'Europe/Paris'>")
 */
private $creationDateTime;

creationDateTime与UTC时区一起存储到数据库中。

更改格式已正确应用于JSON API响应(例如,将“ d / m H:i替换为d / m / YH:i”),但是返回的时间始终是存储的时间(UTC为1)即使我设置了完全不同的时区,也不是预期的时间(欧洲/巴黎)。

例如,如果存储的时间为15:04,则API返回的序列化时间仍为15:04(UTC),而不是预期的时间(16:04,欧洲/巴黎)。

序列化响应时,有什么办法在存储的日期上应用时区吗?

谢谢。

我使用: Symfony 4,JMS-SerializerBundle 3.1.0,JMS-Serializer 2.1.0

编辑:

这是我的解决方法,但绝对不是解决此问题的最佳方法:

/**
 * Returns the signal creation date and time
 *
 * @Serializer\Type(
 *     "DateTime<'d/m/Y H:i'>"
 * )
 *
 * @Serializer\Groups({"signals"})
 * @Serializer\VirtualProperty()
 * @Serializer\Expose
 */
public function getCreationDateTime(): \DateTime
{
    $dateTime = $this->creationDateTime;
    $dateTime->setTimeZone(new \DateTimeZone("Europe/Paris"));

    return $dateTime;
}

1 个答案:

答案 0 :(得分:0)

使其全局化的最佳方法是在以下位置进行配置:

config>软件包> jms_serializer.yaml

像这样:

jms_serializer:
    handlers:
        datetime:
            default_format: "Y-m-d\\TH:i:sP" # ATOM
            default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set

请参阅文档,Extensions Reference部分