Как создать объект DateTime из строки в symfony2/php

в таблице БД у меня есть несколько полей с datetime в поле "Тип". Поэтому мне нужно сохранять данные только как объект date time.

из формы я получаю время даты как строку, как

2012-10-05 17:45:54

теперь, когда я сохраняю свою сущность, я получаю следующую ошибку:

неустранимая ошибка: вызов формата функции-члена () для не-объекта в ..DateTimeType.php on line 44

Я попытался с

$protocol->setStartedAt(strtotime($post['started_at']));

или

$from = DateTime::createFromFormat('yy-mm-dd hh:mm:ss', $post['started_at']);
$protocol->setStartedAt($from);

или просто

$from = new DateTime($post['started_at']);
$protocol->setStartedAt($from);

последний код работает, но он не использует метку времени, переданную как аргумент, но просто получает текущее время.

какие идеи?

3 ответов


Я всегда создаю объект DateTime с его конструктором, os в вашем случае это будет:

$protocol->setStartedAt(new \DateTime($post['started_at']));

если это работает, но не использует отметку времени, вы, вероятно, не имеете значения в $post['started_at']. Попробуйте отладить его или просто сделайте грязный трюк:

die($post['started_at']);

ради будущих читателей, которые конечно когда-нибудь столкнется с этой проблемой (это первый пост, если вы google "symfony 2 datetime from string"), имейте в виду, что в Symfony 2 Объект DateTime не принимает строку с этим форматом : "d/m/Y H:i:s", и, вероятно,не поддерживает многие другие.

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

во-первых, получить дату строка из любого запроса, который вы делаете (в моем случае общий запрос AJAX), и преобразуйте его в Объект DateTime, в этом примере предполагается, что нам нужно создать объект dateTime для 25/04/2015 15:00, который является форматом итальянского DateTimePicker jQuery UI (это только пример):

$literalTime    =   \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00");

(Примечание: используйте \ чтобы использовать объект DateTime php, иначе вы будете использовать объект datetime Symfony, который будет бросьте вам исключение)

затем, как только вы это сделали, создайте дата использование комфорт функция, давая первому параметру ожидаемый формат вывода (Y-m-d H:i:s):

$expire_date =  $literalTime->format("Y-m-d H:i:s");

таким образом, вы на 100% уверены, что любой формат, который вы передаете или получаете, будет правильно преобразован, и вы не получите никакого исключения из объекта DateTime symfony,покуда вы обеспечиваете чего вы ожидаете в качестве входных данных.

зная, что этот пост на самом деле довольно старый, я просто решил опубликовать это, потому что я не нашел другого ценного источника, кроме этого, чтобы понять, где могла быть проблема.

обратите внимание, что лучшим решением по-прежнему является отправка строки datetime в правильном формате, но если у вас буквально нет способов сделать это, самый безопасный способ конвертировать такую строку-это выше.


Как насчет createFromFormat?

http://uk.php.net/manual/en/datetime.createfromformat.php

$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s');