json对象中的symfony3 datetime字符串

时间:2018-02-14 16:49:17

标签: php symfony datetime datetime-format

我提前道歉,如果之前已经回答过,我找不到答案。 而且,我认为我修复了它,但它没有固定的原因。 我有这段代码:

$date = new \DateTime('now');
$dateFormatted = $date->format(\DateTime::ISO8601);
$body->setDate($dateFormatted);

这应该以字符串格式给我当前的日期和时间,对吧? 在此之后,我将字符串传递给json对象,序列化它,并将其存储在数据库中(这是有效的)。 但是,由于某种原因,datetime对象不再格式化,并存储在如下数组中:

{\"timezone\":{\"name\":\"+01:00\",\"transitions\":false,\"location\":false},\"offset\":3600,\"timestamp\":1518626336}

这打破了我的其余功能,因为我想将它存储在一个对象中,每当我再次获取它时,都会从中重新创建一个datetime对象。我无知为何发生这种情况。我清楚地将它格式化为字符串,或者我做错了什么?我也试过清除缓存,但是没有做任何事情。

[编辑]我从人们那里得到了很多答案,告诉我如何将对象序列化为json格式,这不是我想要的(正如我的帖子中所指定的)。这是一个json序列化对象的示例,其中包含数据库中的datetime数组,而不是datetime字符串:(它基本上是一个带有type,date,targetdate和messagetext的消息)

"{\"type\":0,\"date\":{\"timezone\":{\"name\":\"+00:00\",\"transitions\":false,\"location\":false},\"offset\":0,\"timestamp\":1518638298},\"targetDate\":{\"timezone\":{\"name\":\"+01:00\",\"transitions\":false,\"location\":false},\"offset\":3600,\"timestamp\":1518638280},\"status\":0,\"messageText\":null}"

我想用$ dateFormatted = $ date->格式(\ DateTime :: ISO8601)实现的目标;是一个字符串,我可以存储在该对象中。 但我得到的是一个阵列。 我开始认为 - > format()功能已被破坏。

3 个答案:

答案 0 :(得分:0)

我不确定你是如何序列化DateTime对象的。

当你序列化DateTime对象时,它只能变成这样。

您需要做的是当您从数据库中获取数据时,需要对其进行反序列化,在那里您将获得一个DateTime对象

json_encode(new DateTime('@1419237113'));// serialize

json_decode(/*fetch data from db*/);// unserialize 

答案 1 :(得分:0)

我建议您使用 PHP序列化 方法是否要将Object存储在数据库中。

在将DateTime对象($date = new \DateTime('now');)保存到数据库之前,您必须 serialize

示例:

$date = new \DateTime('now');
$serialized_date = serialize($date);

$ serialized_date可以存储为字符串

然后,当您检索序列化的DateTime时,可以根据需要格式化DateTime。在格式化之前,您必须 unserialize 检索到的字符串

示例:

$unserialized_date = unserialize($serialized_date);
echo $unserialized_date->format('Y-m-d H:i:s');
echo $unserialized_date->format(\DateTime::ISO8601);

答案 2 :(得分:0)

我想我已经回答了我自己的问题。我没有将格式化的DateTime对象传递给我的setter,而是将其格式化为我的setter本身。由于某种原因,这是有效的...之后,当我想把它拿回来。我确保将其作为字符串传递出去,而不是日期时间对象。我不知道为什么,但在我的getter之外使用格式,序列化或规范化什么都不做,并将数组传递给setter。