【问题标题】:Symfony - JMS Serializer - Convert a datetime to a specific timezone when serializingSymfony - JMS 序列化器 - 序列化时将日期时间转换为特定时区
【发布时间】:2019-03-04 16:04:38
【问题描述】:

我有一个存储日期时间的实体,我使用 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/Y H:i”),但返回的时间始终是存储的时间(UTC 时间)即使我设置了一个完全不同的时区,也不是预期的(欧洲/巴黎)。

例如,如果存储的时间是 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;
}

【问题讨论】:

    标签: symfony datetime timezone jmsserializerbundle


    【解决方案1】:

    使其全局化的最佳方法是将其配置在:

    配置 > 包 > 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 部分

    【讨论】:

    • 感谢您的回复。是的,这是一个解决方案,但是直接在属性级别添加带有预期时区的注释也应该可以工作并处理转换,还是我遗漏了什么?
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多