Symfony2 datetime存储时间戳的最佳方法是什么?

nas*_*asy 12 php datetime timestamp symfony doctrine-orm

我不知道哪个是在数据库中存储时间戳的最佳方法.我想用小时分钟和秒来存储整个日期,但它只存储日期(例如2012-07-14),我想存储2012-07-14 HH:MM:SS.我正在使用dateTime对象.这是代码:

在控制器中:

$user->setCreated(new \DateTime());
Run Code Online (Sandbox Code Playgroud)

在实体中:

/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="date")
 */
private $created;
Run Code Online (Sandbox Code Playgroud)

将日期和时间分别存储在数据库中更好吗?或者更好地存储所有像YYYY-MM-DD HH:MM:SS?然后,我将比较日期并计算剩余时间,因此这对于稍后简化操作非常重要.所以你怎么看 ?有人能帮助我吗?

Gor*_*don 12

如果数据库支持该类型,则在数据库中存储时间戳的最佳方法显然是使用timestamp列.由于您可以在创建时将该列设置为自动更新,因此您甚至不必为其提供setter.

Doctrine 2有一个Timestampable行为扩展,它也完全来自用户端:

时间戳行为将自动更新实体或文档上的日期字段.它通过注释工作,可以更新创建,更新甚至特定属性值更改的字段.

特征:

  • 自动预定日期字段更新创建,更新甚至记录属性更改
  • ORM和ODM支持使用相同的侦听器
  • 属性的特定注释,不需要任何接口
  • 可以对特定属性或关系更改为特定值做出反应
  • 可以与其他行为嵌套
  • 注释,Yaml和Xml映射支持扩展

有了这种行为,您需要做的就是将注释更改为

/**
 * @var datetime $created
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $created;
Run Code Online (Sandbox Code Playgroud)

然后你不需要调用setCreated你的代码.首次创建实体时,将自动设置该字段.


Mic*_*ick 11

为了在不使用doctrine的Timestampable行为的情况下存储创建日期,您还可以通过在声明类时添加注释来使用LifeCycle Callbacks@ORM\HasLifecycleCallbacks.以下是在您的情况下在数据库中存储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');
    }
Run Code Online (Sandbox Code Playgroud)

最后,如果您遇到时区问题,可以在登录时使用事件监听器在会话中设置时区.马特Drolette做了自己的博客真棒工作在这里.无论如何,您可能总是将时间存储在服务器所在的时区中.然后使用会话中设置的时区向用户显示正确的时间.祝好运.


the*_*imp 5

在@ Pratt的回答基础上,我做到了这一点.我的实体中有2个字段用于创建,1个用于修改.

/**
* @ORM\Column(type="datetime")
 */
protected $created_at;

/**
* @ORM\Column(type="datetime")
 */
protected $modified_at;
Run Code Online (Sandbox Code Playgroud)

然后使用注释我在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')));
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数可以分为两个函数,一个用于创建一个用于更新,但这是有效的,所以我认为没有理由在正常工作时使用额外的代码.