Строка даты и времени symfony3 в объекте json

Заранее извиняюсь, если ответ уже был, то ответа не нашел. И еще, я думал, что починил его, но он не был исправлен без видимой причины. У меня есть этот код:

$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}

Это нарушает остальную часть моей функциональности, так как я хочу сохранить ее в объекте и воссоздать из нее объект даты и времени всякий раз, когда я снова его извлекаю. Я понятия не имею, почему это происходит. Я явно форматирую его в строку, или я делаю что-то не так? Я также пытался очистить кеш, но это ничего не дало.

[EDIT] У меня много ответов от людей, рассказывающих мне, как сериализовать объект в формат json, это не то, что я ищу (как указано в моем посте). Это пример сериализованного объекта json, содержащего массив даты и времени в моей базе данных вместо строки даты и времени: (это в основном сообщение с типом, датой, целевой датой и текстом сообщения)

"{\"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->format(\DateTime::ISO8601); это строка, которую я могу сохранить в этом объекте. но то, что я получаю, это массив. я начинаю думать, что функциональность ->format() не работает.


person Glenn van Acker    schedule 14.02.2018    source источник
comment
Похоже, вы устанавливаете какой-то другой объект вместо $dateFormatted в $body-›setDate где-то. Объект \DateTime, закодированный в json, также отличается от вашего образца.   -  person solarc    schedule 14.02.2018
comment
Я тоже так думал, и я проверил и перепроверил. и я не кодирую объект даты и времени, я кодирую объект json, который содержит отформатированный объект даты и времени в виде строки. только он не отформатирован...   -  person Glenn van Acker    schedule 14.02.2018


Ответы (3)


Я не уверен в том, как вы сериализуете объект DateTime.

когда вы сериализуете объект DateTime, он может стать таким только.

что вам нужно сделать, это когда вы извлекаете данные из базы данных, вам нужно их десериализовать, там вы получите объект DateTime

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

json_decode(/*fetch data from db*/);// unserialize 
person Shobi    schedule 14.02.2018
comment
я не сериализую объект даты и времени, я сохраняю дату и время в виде строки в объекте, а затем сериализую этот объект. проблема в том, что, поскольку format() на самом деле не форматирует его как строку, конструктор datetime выдаст ошибку, говорящую, что он ожидает строку, а не объект, когда я пытаюсь вернуть это значение. - person Glenn van Acker; 14.02.2018

Я рекомендую вам использовать метод PHP Serialize, если вы хотите сохранить Object в базе данных.

Вы должны сериализовать объект DateTime ($date = new \DateTime('now');) перед сохранением в базе данных.

Пример:

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

$serialized_date может храниться как String.

Затем, когда вы получаете сериализованный DateTime, вы можете отформатировать DateTime по своему усмотрению. Перед форматированием необходимо десериализовать полученный Строка.

Пример:

$unserialized_date = unserialize($serialized_date);
echo $unserialized_date->format('Y-m-d H:i:s');
echo $unserialized_date->format(\DateTime::ISO8601);
person Praneeth Nidarshan    schedule 14.02.2018
comment
Я использую компонент сериализатора symfony для сериализации объекта, который содержит строку даты и времени. сначала я форматирую объект datetime с помощью -›format(), затем помещаю его в объект и сериализую объект. но форматирование не работает. сериализация в порядке, так же как и десериализация. - person Glenn van Acker; 14.02.2018

Думаю, я ответил на свой вопрос. Вместо того, чтобы передавать отформатированный объект DateTime моему установщику, я отформатировал его в самом установщике. по какой-то причине это работает... после этого, когда я хочу вернуть его обратно. я обязательно передам его как строку, а не как объект даты и времени. Я не знаю почему, но использование форматирования, сериализации или нормализации вне моего геттера ничего не делает и передает массив в сеттер.

person Glenn van Acker    schedule 14.02.2018