Php Symfony2 datetime存储时间戳的最佳方式?

Php Symfony2 datetime存储时间戳的最佳方式?,php,datetime,symfony,doctrine-orm,timestamp,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; 在实体

我不知道在数据库中存储时间戳的最佳方法是什么。我想用时分秒存储整个日期,但它只存储日期(例如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;
在实体中:

$user->setCreated(new \DateTime());
/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="date")
 */
private $created;

在数据库中单独存储日期和时间是否更好?还是像YYYY-MM-DD HH:MM:SS那样一起存储更好?然后,我将不得不比较日期并计算剩余时间,因此这对于以后简化操作非常重要。那你觉得呢?有人能帮我吗?

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

还有一个从用户端也能做到这一点的方法:

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

功能:

$user->setCreated(new \DateTime());
/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="date")
 */
private $created;
  • 在创建、更新甚至记录属性更改时自动预定义日期字段更新
  • ORM和ODM支持使用相同的侦听器
  • 属性的特定注释,不需要接口
  • 可以对特定属性或特定值的关系更改作出反应
  • 可以与其他行为嵌套
  • 对扩展的注释、Yaml和Xml映射支持
使用此行为,您只需将注释更改为

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

然后您不需要在代码中调用
setCreated
。该字段将在首次创建实体时自动设置。

为了存储创建日期而不使用条令的时间标记行为,您还可以在声明类时添加注释
@ORM\haslifecycellbacks
。以下是在您的情况下将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');
    }
最后,如果您有时区问题,可以在登录时使用事件侦听器设置会话中的时区。马特·德罗莱特在他的博客上做了一件很棒的工作。
您可能总是将时间存储在服务器所在的时区中。然后使用会话中设置的时区向用户显示正确的时间。祝你好运。

基于@Pratt的回答,我做到了这一点。我的实体中有两个字段,一个用于创建,一个用于修改

/**
* @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')));
    }
}

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

您可以像这样使用@Version:

/**
 * @var date $created
 *
 * @ORM\Column(name="created", type="datetime")
 * @ORM\Version
 */
private $created;

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

如果您需要处理不同的时区,那么如果您处理不同的时区,读取时间表并没有多大帮助。好的,我会试试,这个选项看起来很棒。谢谢@meze在这个问题中没有提到不同的时区,我认为时区与“创建”字段无关。@Gordon+1这篇很棒的文章。我试着将你的方法与我使用的方法进行比较(见下文)。我得到的时间非常相似,但仍然不同。(你的方法:2012-07-25 00:07:29;我的方法:2012-07-25 00:00:29)这是什么原因?哪个时间更准确?Thanks@Sydney_o9我不知道原因。有七个小时的时间差,这使我认为这两种方法中的任何一种都没有正确设置时区。代码的问题是您将其存储在字符串中,这使得无法对其执行sql操作并且仍然有效。您的格式有一个错误:月与分钟。正确的格式是…日期('Y-m-d H:i:s');如果属性的类型为
datetime
而不是
string
,则应使用:
$this->created=new\datetime()我更喜欢它,而不是仅仅为了这个下载Gedmo扩展。。。但这个版本到底做了什么呢?