我不知道哪个是在数据库中存储时间戳的最佳方法。我想用小时分钟和秒来存储整个日期,但它只存储日期(例如2012-07-14),我想存储2012-07-14 HH:MM:SS。我正在使用dateTime对象。这是代码:
在控制器中:
$user->setCreated(new \DateTime());
在实体中:
/**
* @var date $created
*
* @ORM\Column(name="created", type="date")
*/
private $created;
最好将日期和时间分别存储在数据库中吗?或者更好地存储所有像YYYY-MM-DD HH:MM:SS?然后我将比较日期并计算剩余时间,因此这对于稍后简化操作非常重要。所以你怎么看 ?有人能帮助我吗?
答案 0 :(得分:12)
如果数据库支持该类型,则在数据库中存储时间戳的最佳方法显然是使用timestamp列。因为你可以在创建时将该列设置为自动更新,所以你甚至不必为它提供一个setter。
还有一个Timestampable behavior extension for Doctrine 2,它也完全来自用户方:
时间戳行为将自动更新您的实体或文档上的日期字段。它通过注释工作,可以在创建,更新甚至特定属性值更改时更新字段。
功能强>
- 关于创建,更新甚至记录属性更改的自动预定日期字段更新
- 使用相同侦听器的ORM和ODM支持
- 属性的特定注释,无需接口
- 可以对特定属性或关系更改对特定值做出反应
- 可与其他行为嵌套
- 扩展的注释,Yaml和Xml映射支持
使用此行为,您只需将注释更改为
即可/**
* @var datetime $created
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
*/
private $created;
然后您无需在代码中调用setCreated
。第一次创建实体时,将自动设置该字段。
答案 1 :(得分:11)
为了在不使用doctrine的Timestampable行为的情况下存储创建日期,您还可以在声明类时通过添加注释@ORM\HasLifecycleCallbacks
来使用LifeCycle Callbacks。以下是您在数据库中存储 YYYY-MM-DD HH:MM:SS 的情况。
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="yourTable")
*/
class Nasy
{
/**
* @ORM\Column(name="created", type="string", length=255)
*/
private $created;
/**
* @ORM\PrePersist
*/
public function doStuffOnPrePersist()
{
$this->created = date('Y-m-d H:i:s');
}
最后,如果您遇到时区问题,可以在登录时使用事件监听器在会话中设置时区。 Matt Drolette在他的博客here上做了很棒的工作。 无论如何,您可能总是将时间存储在服务器所在的时区中。然后使用会话中设置的时区向用户显示正确的时间。祝你好运。
答案 2 :(得分:5)
在@ Pratt的回答基础上,我做到了这一点。我的实体中有2个字段,一个用于创建,另一个用于修改。
/**
* @ORM\Column(type="datetime")
*/
protected $created_at;
/**
* @ORM\Column(type="datetime")
*/
protected $modified_at;
然后使用注释我在prePersist和preUpdate
上调用它/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps()
{
$this->setModifiedAt(new \DateTime(date('Y-m-d H:i:s')));
if($this->getCreatedAt() == null)
{
$this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
}
}
该函数可以分解为2个函数,一个用于创建一个用于更新,但这是有效的,所以我认为没有理由在正常工作时使用额外的代码。
答案 3 :(得分:4)
您可以像这样使用@Version:
/**
* @var date $created
*
* @ORM\Column(name="created", type="datetime")
* @ORM\Version
*/
private $created;
这只适用于日期时间类型。