我正在我的Symfony CRM上实现Bootstrap日期范围选择器,以便我的客户端为特定的假期选择一系列日期。
但是,在将数据添加到数据库时,它需要采用"开始日期"和"结束日期"的格式。数据库需要一个DateTime
对象,但我希望它在客户端的前端更具可读性。
这是提交后传递回控制器的内容:
2017/5/20 - 2017/7/20
在我的控制器中,我使用以下代码:
$dates = $form['startDate']->getData();
$date_bits = explode(" - ",$dates);
$startDate = DateTime::createFromFormat('Y-m-d',$date_bits[0]);
$endDate = DateTime::createFromFormat('Y-m-d',$date_bits[1]);
除非我坚持到数据库,否则我会收到此错误:
致命错误:在布尔值上调用成员函数 format()/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on online 53
所以我尝试了这种方法:
$startDate = new DateTime(str_replace("/","-",$date_bits[0]));
$endDate = new DateTime(str_replace("/","-",$date_bits[1]));
$startDate = $startDate->format('Y-m-d');
$endDate = $endDate->format('Y-m-d');
但是我收到同样的错误。我在这里做错了什么?
编辑:实际上对于第二个代码块,错误状态是我在字符串上调用format()
。
DateTime::createFromFormat() 返回 false 意味着表示您提交日期的任何字符串都与您提供的格式不匹配。
DateTime::createFromFormat 的第一个参数应该是您要提交给它的格式,在本例中为 "d/m/Y"。然后,您可以执行$startDate->format('Y-m-d')以按所需方式格式化日期。
$dates = $form['startDate']->getData();
$date_bits = explode(" - ",$dates);
$startDate = DateTime::createFromFormat('d/m/Y',$date_bits[0])->format('Y-m-d'); // 2017-05-20
$endDate = DateTime::createFromFormat('d/m/Y',$date_bits[1])->format('Y-m-d'); // 2017-07-20
注意:不要使用 ->format() 如果您希望它保留为 DateTime 对象。格式始终返回字符串。
通常我使用这个日期:
$startDate = new Datetime($date_bits[0]);
$endDate = new Datetime($date_bits[1]);
如果你想使用CreateFromFormat,请尝试这个:
$startDate = new DateTime::createFromFormat('d/m/Y', $date_bits[0])->format('Y-m-d');
$endDate = new DateTime::createFromFormat('d/m/Y', $date_bits[1])->format('Y-m-d');
错误消息:
致命错误:在第 53 行的/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php 中的布尔值上调用成员函数 format()
由尝试在不是DateTime
对象而是布尔值(更具体地说FALSE
)上调用DateTime::format()
的代码生成。
它实际上是$startDate
的值,由不知道如何解析输入字符串的DateTime::__construct()
返回。
你给它传递一个像20/5/2017
这样的日期.显然,它的格式是'd/m/Y'
.
DateTime::__construct()
和strftime()
都不明白。他们期望要么m/d/Y
,要么Y/m/d
.他们不可能在没有任何提示的情况下区分d/m/Y
和m/d/Y
,PHP 程序员选择忽略d/m/Y
m/d/Y
因为使用得更多。
但是,对于无法直接理解的日期和时间格式,始终存在函数DateTime::createFromFormat()
。它允许你告诉引擎在字符串中搜索哪些日期和时间组件以及顺序。
您所要做的就是正确使用它:
$startDate = DateTime::createFromFormat('d/m/Y',$date_bits[0]);