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

В таблице DB у меня есть несколько полей с datetime как тип поля. Поэтому мне нужно сохранить данные только как объект времени.

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

2012-10-05 17:45:54

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

Неустранимая ошибка: вызов в формате функции-члена() для не-объекта в.. \DateTimeType.php в строке 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);

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

Любые идеи?

Ответ 1

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

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

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

die($post['started_at']);

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 4

П.С.: Это не ответ, просто еще один вопрос...

Хорошо, я знаю, что это старый вопрос, но с такой же ситуацией. Теперь я беру "дату" из формы и передаю все эти данные с помощью метода form.serialize() с помощью ajax. На стороне Symfony я получаю это значение в формате строки. Теперь, когда я пытаюсь вставить эти данные в базу данных, я получаю сообщение об ошибке, так как типу этого поля присваивается "дата". Так что благодаря @Laurynas Mališauskas я решил эту проблему. Но что если теперь я получу значение null из формы для этого значения даты? Есть идеи? Ох, кстати, сейчас я использовал условие if($dateValue != null OR $dateValue != ''). Позвольте мне, если есть какой-то другой и лучший вариант... Заранее спасибо.. :)