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

时间:2012-10-05 16:07:19

标签: php datetime symfony

在数据库表中,我有几个字段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);

最后一个代码有效,但它不使用作为争论传递的时间戳,而只是获取当前时间。

有什么想法吗?

3 个答案:

答案 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');