15

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

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

2012-10-05 17:45:54

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

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

我试过了

$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);

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

有任何想法吗?

4

3 回答 3

21

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

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

如果这有效但不使用发布的时间戳,您可能没有$post['started_at']. 尝试调试它或只是做肮脏的把戏:

die($post['started_at']);
于 2012-10-06T15:07:44.690 回答
12

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

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

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

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

(注意:使用\php 的 DateTime 对象,否则你将使用 Symfony 的 datetime 对象,这会抛出异常)

然后,一旦你这样做了,使用舒适格式函数创建一个日期字符串,方法是为第一个参数提供预期的输出格式():Y-m-d H:i:s

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

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

知道这篇文章实际上已经很老了,所以我才决定发布它,因为我没有找到任何其他有价值的来源,除了这个来了解问题可能出在哪里。

请注意,最好的解决方案仍然是以正确的格式发送日期时间字符串,但如果您确实无法做到这一点,那么转换此类字符串的最安全方法就是上述方法。

于 2015-06-18T09:12:27.747 回答
1

createFromFormat 怎么样?

http://uk.php.net/manual/en/datetime.createfromformat.php

$from = DateTime::createFromFormat($post['started_at'], 'Y-m-d H:i:s');
于 2012-10-05T16:14:39.763 回答