在Symfony中格式化日期的问题



我正在我的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/Ym/d/Y,PHP 程序员选择忽略d/m/Ym/d/Y因为使用得更多。

但是,对于无法直接理解的日期和时间格式,始终存在函数DateTime::createFromFormat()。它允许你告诉引擎在字符串中搜索哪些日期和时间组件以及顺序。

您所要做的就是正确使用它:

$startDate = DateTime::createFromFormat('d/m/Y',$date_bits[0]);

相关内容

  • 没有找到相关文章

最新更新