如何在 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 中正确存储日期时间?的主要内容,如果未能解决你的问题,请参考以下文章