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

Upv*_*ote 11 php datetime symfony

在数据库表中,我有几个字段datetime类型的字段.所以我需要将数据仅作为日期时间对象保留.

从表格我得到日期时间字符串

2012-10-05 17:45:54
Run Code Online (Sandbox Code Playgroud)

现在,当我坚持我的实体时,我得到以下错误:

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

我试过了

$protocol->setStartedAt(strtotime($post['started_at']));
Run Code Online (Sandbox Code Playgroud)

要么

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

要不就

$from = new \DateTime($post['started_at']);
$protocol->setStartedAt($from);
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Lau*_*kas 17

我总是用它的构造函数创建DateTime对象,在你的情况下它将是:

$protocol->setStartedAt(new \DateTime($post['started_at']));
Run Code Online (Sandbox Code Playgroud)

如果这样做,但不使用发布的时间戳,你可能没有$ post ['started_at']中的值.尝试调试它或只是做肮脏的技巧:

die($post['started_at']);
Run Code Online (Sandbox Code Playgroud)


bri*_*eje 11

为了将来有一天肯定会遇到这个问题的读者(这是第一篇帖子,如果你google"symfony 2 datetime from string"),请记住,在Symfony 2中,DateTime对象不接受具有该格式的字符串:"d/m/Y H:i:s",也可能不支持其他许多人.

为了不对此感到生气,我实际上发现避免此类错误的最简单,最安全的解决方案是:

首先,从您正在进行的任何类型的请求中获取日期字符串(在我的情况下是一个通用的AJAX请求)并将其转换为DateTime对象,此示例假定我们需要为其创建一个dateTime对象25/04/2015 15:00,这是jQuery UI italian DateTimePicker(这只是一个例子):

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

(注意:使用\php的DateTime对象,否则你将使用Symfony的datetime对象,它将引发异常)

然后,一旦你这样做,使用舒适格式函数创建一个日期字符串,通过给第一个参数输出格式expected():Y-m-d H:i:s

$expire_date =  $literalTime->format("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以100%确定您传递或接收此格式的任何格式都将被正确转换,并且您不会从DateTime symfony对象中获得任何类型的异常,只要您提供您期望的那样的输入.

知道这篇文章实际上已经很老了,我刚刚决定发帖,因为我没有找到任何其他有价值的资源,但是这个可以解决问题所在.

请注意,最好的解决方案仍然是以正确的格式发送日期时间字符串,但是如果你真的没有办法做到这一点,那么转换这样一个字符串的最安全的方法就是上面的那个.