当我在处理我的Symfony2项目时,(又一次)出现了一个奇怪的bug。Symfony2/Doctrine2 - 从数据库获取日期时间时的问题
我创建含有dateCreated
属性的实体Check
和一些其他属性,以便我可以链接Check
到被延伸的ProductBase
不同的实体。下面是Check
样品和AProduct
:
/**
* Check
*
* @ORM\Table(name="check")
* @ORM\Entity
*/
class Check
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\Column(name="date_created", type="datetime")
*/
private $dateCreated;
[...]
/**
* @ORM\ManyToOne(targetEntity="Acme\BlogBundle\Entity\AProduct", inversedBy="checks")
* @ORM\JoinColumn(name="aproduct_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $aproduct;
[...]
}
/**
* AProduct
*
* @ORM\Table(name="aproduct")
* @ORM\Entity
*/
class AProduct extends ProductBase
{
[...]
/**
* @ORM\OneToMany(targetEntity="Acme\BlogBundle\Entity\Check", mappedBy="product")
* @ORM\OrderBy({"dateCreated" = "DESC"})
*/
protected $checks;
[...]
}
所以我的问题是,当我试图下面显示在我的控制器之一dateCreated
属性,看代码,Symfony2的(或Doctrine2)被加入整整一个月存储在数据库中的日期,我不知道为什么它的发生:
[...]
$aproduct = $aproducts[0];
$checks = $aproduct->getChecks();
$lastCheck = $checks->toArray()[0]; //I know it's not 'safe' but it's shorter to expose my problem
var_dump($lastCheck->getDateCreated());
结果:
object(DateTime)[854]
public 'date' => string '2014-01-20 16:21:41' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
价值存储在数据库:
2013-12-20 16:21:41
我不明白最重要的是,在另一个控制器,具有完全相同的方法,但在不同的产品(BProduct
例如),我得到正确的日期... 有没有人已经面对这个问题,或者有什么线索来解决它?
再次感谢您。如果您需要更多的信息,只需询问,我会尽可能提供帮助。
编辑:存储在aproducts
其余aproduct
都显示正确的日期......
您是否使用了此处建议的自定义日期时间类型? http://docs.doctrine-project.org/en/2.0.x/cookbook/working-with-datetime.html#handling-different-timezones-with-the-datetime-type – YRM
@YRM为什么时区会影响DateTime整整一个月? – sjagr
我会打印 - 调试发生在Doctrine \ DBAL \ Types \ DateTimeType :: convertToPHPValue()中,问题可能出现在您自己的代码中。 –