如何在symfony2/php中从字符串创建DateTime对象

如何在symfony2/php中从字符串创建DateTime对象,php,datetime,symfony,Php,Datetime,Symfony,在DB表中,我有几个字段,字段类型为datetime。所以我只需要将数据持久化为日期时间对象 从一个表单中,我得到了类似字符串的日期时间 2012-10-05 17:45:54 现在,当我坚持我的实体时,我得到以下错误: 致命错误:对中的非对象调用成员函数format() ..\DateTimeType.php,第44行 我试过了 $protocol->setStartedAt(strtotime($post['started_at'])); 或 或者只是 $from = new \D

在DB表中,我有几个字段,字段类型为
datetime
。所以我只需要将数据持久化为日期时间对象

从一个表单中,我得到了类似字符串的日期时间

2012-10-05 17:45:54
现在,当我坚持我的实体时,我得到以下错误:

致命错误:对中的非对象调用成员函数format() ..\DateTimeType.php,第44行

我试过了

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

或者只是

$from = new \DateTime($post['started_at']);
$protocol->setStartedAt($from);
最后一个代码可以工作,但它不使用作为参数传递的时间戳,而只是获取当前时间


有什么想法吗?

createFromFormat怎么样


我总是使用构造函数创建一个
DateTime
对象,在您的情况下,它是:

$protocol->setStartedAt(new \DateTime($post['started_at']));
如果这样做有效,但不使用发布的时间戳,则在
$post['started\u at']
中可能没有该值。尝试调试它,或者只执行肮脏的技巧:

die($post['started_at']);

为了将来的读者,他们肯定有一天会遇到这个问题(如果你用谷歌搜索“symfony 2 datetime from string”,这是第一篇文章),请记住,在symfony 2中,datetime对象不接受具有以下格式的字符串:
“d/m/Y H:i:s”
,并且可能也不支持许多其他格式的字符串

为了避免变得疯狂,我发现避免此类错误的最简单、最安全的解决方案是:

首先,从您正在执行的任何类型的请求(在我的例子中是一个通用AJAX请求)中获取日期字符串,并将其转换为日期时间对象,此示例假设我们需要为
25/04/2015 15:00
创建一个日期时间对象,这是jQuery UI意大利日期时间选择器的格式(这只是一个例子):

(注意:使用
\
来使用php的DateTime对象,否则您将使用Symfony的DateTime对象,该对象将引发异常)

然后,一旦您这样做了,使用comfortformat函数创建一个日期字符串,为第一个参数指定预期的输出格式(
Y-m-d H:i:s
):

通过这种方式,您可以100%确保传递或接收的任何类型的格式都会正确转换,并且只要您提供所需的输入,DateTime symfony对象不会出现任何异常

我知道这篇文章其实很老了,所以我决定发这篇文章,因为除了这篇文章之外,我没有找到任何其他有价值的来源来理解问题可能出在哪里


请注意,最好的解决方案仍然是以正确的格式发送datetime字符串,但是如果您确实没有办法这样做,那么转换此类字符串最安全的方法就是上面的方法。

抱歉,刚才看到您已经有了这个方法-它无法工作,因为格式看起来不正确。请尝试使用链接页面匹配您的表单确切地说,它是PHP格式的,而不是奇怪的Symfony格式…不,仍然会出现此错误,在非对象DateTimeType.PHP行调用成员函数format()。上面的解决方案是错误的。正确的解决方案=
$from=\DateTime::createFromFormat('Y-m-d H:i:s',$post['started_at']);
您确定
$post['started_at']
包含您想要的内容?它不是
$\u POST['started\u at']
?而且,
DateTime
对象和方法会在错误时抛出异常。您没有得到这些异常吗?尝试使用
Try/catch
。更多调试:
var\u dump
新DateTime()的结果,如果错误,请使用
var\u dump(\DateTime::getLastErrors())
了解更多详细信息。为什么使用反斜杠?因此symfony不会解释它?您可以使用
use
语句添加日期时间,则不需要反斜杠。否则您必须声明类的完整路径,在这种情况下,它位于默认命名空间中,因此只需要反斜杠。
$protocol->setStartedAt(new \DateTime($post['started_at']));
die($post['started_at']);
$literalTime    =   \DateTime::createFromFormat("d/m/Y H:i","25/04/2015 15:00");
$expire_date =  $literalTime->format("Y-m-d H:i:s");