在数据库表中,我有几个字段datetime
作为字段类型。所以我需要将数据仅保留为日期时间对象。
从表单中我将日期时间视为字符串
2012-10-05 17:45:54
现在,当我坚持我的实体时,我得到以下错误:
致命错误:在非对象中调用成员函数format() 第44行的.. \ DateTimeType.php
我试过
$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);
最后一个代码有效,但它不使用作为争论传递的时间戳,而只是获取当前时间。
有什么想法吗?
答案 0 :(得分:16)
我总是用它的构造函数创建DateTime对象,在你的情况下它将是:
$protocol->setStartedAt(new \DateTime($post['started_at']));
如果这样做,但不使用发布的时间戳,你可能没有$ post ['started_at']中的值。尝试调试它或者只是做一些肮脏的技巧:
die($post['started_at']);
答案 1 :(得分:10)
为了未来读者肯定有一天会遇到这个问题(这是第一篇帖子,如果你google“symfony 2 datetime from string”),请记住在Symfony 2中DateTime object不接受具有该格式的字符串:"d/m/Y H:i:s"
,并且可能也不支持许多其他字符串。
为了不致疯狂,我实际上发现避免此类错误的最简单,最安全的解决方案是:
首先,从你正在做的任何类型的请求中获取你的日期 string (在我的情况下是一个通用的AJAX请求)并将其转换为 DateTime对象,这个例子假设我们需要为25/04/2015 15:00
创建一个dateTime对象,这是jQuery UI italian DateTimePicker的格式(这只是一个例子):
$literalTime = \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00");
(注意:使用\
来使用php的DateTime对象,否则你将使用Symfony的datetime对象,它将引发异常)
然后,完成后,使用comfort 格式函数创建日期字符串,方法是为第一个参数指定预期的输出格式(Y-m-d H:i:s
):
$expire_date = $literalTime->format("Y-m-d H:i:s");
通过这种方式,您可以100%确定您传递或接收此格式的任何格式都将被正确转换,并且您不会从DateTime symfony对象中获得任何类型的异常,只要您提供您期望作为输入。
知道这篇文章实际上已经很老了,我刚刚决定发帖,因为我没有找到任何其他有价值的资料来源,但是这个可以解决问题所在。
请注意,最佳解决方案仍然是以正确的格式发送日期时间字符串,但如果你真的无法做到这一点,那么转换这种字符串最安全的方法就是上面那个。
答案 2 :(得分:1)
createFromFormat怎么样?
http://uk.php.net/manual/en/datetime.createfromformat.php
$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s');