【问题标题】:Problems with formatting a date in Symfony在 Symfony 中格式化日期的问题
【发布时间】:2017-05-31 08:52:32
【问题描述】:

我正在我的 Symfony CRM 上实施 Bootstrap 日期范围选择器,以便我的客户选择特定假日季节的日期范围。

但是,在将数据添加到数据库时,它需要采用开始日期和结束日期的格式。数据库需要一个 DateTime 对象,但我希望它在前端对客户端更具可读性。

这是提交后传递回控制器的内容:

20/5/2017 - 20/7/2017

在我的控制器中,我使用以下代码:

$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 上线 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('d/m/Y') 有什么问题?阅读date & time formats understood by strftime()
  • 它需要像 Y-m-d 这样进入数据库,因为这是日期字段所期望的。
  • DateTime::createFromFormat('d/m/Y', $date_bits[0])->format('Y-m-d')

标签: php symfony datetime doctrine-orm


【解决方案1】:

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

注意:如果您希望它保留为 DateTime 对象,请不要使用->format()。格式总是返回一个字符串。

【讨论】:

  • 您确定您的 $dates 实际上是一个字符串“20/5/2017 - 20/7/2017”吗?我刚刚自己测试了上面的代码,效果很好。
  • 是的,它起作用了 - 抱歉,我在 PHP 沙盒中玩耍并且暂时更改了格式!谢谢
【解决方案2】:

我通常使用这个日期:

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

【讨论】:

  • 不幸的是我得到了同样的错误。这是$date_bits的打印:Array ( [0] => 01/02/2017 [1] => 30/04/2017 )
【解决方案3】:

错误信息:

致命错误:在第 53 行的 /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php 中的布尔值上调用成员函数 format()

由尝试在不是DateTime 对象而是布尔值(更具体的FALSE)的对象上调用DateTime::format() 的代码生成。

实际上是DateTime::__construct()返回的$startDate的值,不知道如何解析你的输入字符串。

您将日期传递给它,例如 20/5/2017。显然,它的格式是'd/m/Y'

DateTime::__construct()strftime() 不明白。他们期望m/d/YY/m/d。他们不可能在没有任何提示的情况下将d/m/Ym/d/Y 区分开来,PHP 程序员选择忽略d/m/Y,因为m/d/Y 被使用得更多。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多