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

时间:2012-07-16 13:06:55

标签: php datetime symfony doctrine-orm timestamp

我不知道哪个是在数据库中存储时间戳的最佳方法。我想用小时分钟和秒来存储整个日期,但它只存储日期(例如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?然后我将比较日期并计算剩余时间,因此这对于稍后简化操作非常重要。所以你怎么看 ?有人能帮助我吗?

4 个答案:

答案 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;

这只适用于日期时间类型。