我提前道歉,如果之前已经回答过,我找不到答案。 而且,我认为我修复了它,但它没有固定的原因。 我有这段代码:
$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()功能已被破坏。
答案 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。