如何在 Symfony 3 中正确存储日期时间?

Posted

技术标签:

【中文标题】如何在 Symfony 3 中正确存储日期时间?【英文标题】:How do I properly store a datetime in Symfony 3? 【发布时间】:2017-08-10 09:17:51 【问题描述】:

我正在尝试将 mysql 日期时间存储在 Symfony 存储库中,但出现错误。尝试了来自网络和堆栈的几个建议,但没有什么能让这个错误消失。这就是我想要做的(为了清楚起见,代码被缩写)

我的实体字段:

/**
 * @var \DateTime
 *
 * @ORM\Column(name="created", type="datetime")
 */
private $created;

我的回购代码:

$reservedays = 84;
$now = new \DateTime('NOW');
$now->modify('+' . $reservedays .' days');
$payment = new AppBundle\Entity\Payment;
$payment->setCreated( $now->format('Y-m-d h:i:s') );

但我一直收到此错误:

Error: Call to a member function format() on string
500 Internal Server Error - FatalErrorException 

Stack Trace:
1. in vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php at line 53  -

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    
        return ($value !== null)
            ? $value->format($platform->getDateTimeFormatString()) : null;
    
    /**

如您所见,我想获取当前日期并添加 84 天,然后将其存储到 mysql 日期时间中,但无论我尝试了什么,此错误都会不断出现。有人吗?

【问题讨论】:

传递实际的日期时间对象:$payment->setCreated($now); $now 根据其调用 format() 函数是一个字符串。那不应该。尝试在您的回购中取出 NOW 作为参数 另见this SO post 【参考方案1】:

创建新的 DateTime 对象时不必使用“NOW”。您可以简单地使用$now = new \DateTime() 作为实际日期/时间。

就您而言 - 完全没问题。要创建 DateTime 对象,通过添加 XYdays 来修改它,所以:

$reservedays = 84;
$now = new \DateTime();
$now->modify('+' . $reservedays .' days');

但是你应该使用 DateTime 对象作为 setCreated() 方法参数,因为 $created 属性具有 \DateTime 类型。 Symfony 中的 Doctrine 层负责将数据正确地持久化到数据库中,所以这应该可以正常工作:

$payment = new AppBundle\Entity\Payment;
$payment->setCreated($now);

【讨论】:

【参考方案2】:

您正在尝试将string 保存在datetime 列中。别再打电话给format() // <- Returns a string,它会起作用的。

此外,您可以通过在 Payment 对象的 constructor method 中初始化 $createdAt 来简化一切。每当调用该类的新实例时,都会调用构造函数。您也可以将变量传递给构造函数。

例如

// AppBundle\Entity\Payment
//...
class Payment

    //...
    // Set a default value for the passed-in variable.
    public function __construct($reserveDays = 0)
    
        $this->createdAt = new \DateTime('+'.$reserveDays.' days');
    

用法

// AppBundle\Controller\PaymentController.php
//...
$payment = new AppBundle\Entity\Payment(84);

【讨论】:

您的回答也是正确的,但 Honza 的回答与我发布的代码非常相似,因此我接受了他的回答,以避免对可能阅读此回答的其他人造成任何混淆。

以上是关于如何在 Symfony 3 中正确存储日期时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中验证日期?

如何计算按多个日期分组的行(在 Symfony 中)?

如何让我的日期与每周的开始/结束正确对齐?

EasyAdmin 3 日期时间选择器时间格式

如何用twig和symfony在输入中显示日期?

如何将令牌存储作为参数传递给 Symfony 3.4 中的事件监听器