我正在使用带有 MySql 的 Propel 1.6。我在所有表上设置了时间戳行为,如下所示:
<database name="default" >
<behavior name="timestampable">
<parameter name="create_column" value="creation_date" />
<parameter name="update_column" value="last_modified" />
</behavior>
<table name="book" phpName="Book">
<!-- table colums omitted -->
</table>
</database>
根据 Propel 时间戳行为的文档,没有指定时区的参数。
我注意到时间戳行为默认情况下不会设置 UTC 时间。例如,在我的例子中,它设置 UTC+1。
做了一些调查,我发现如果我使用preInsert()
钩子来设置时间而不是行为并且我传递了 Unix 时间戳:
public function preInsert(PropelPDO $con = null)
{
$this->setCreationDate(time());
return true;
}
结果时间仍然是 UTC+1。如果我使用DateTime
对象而不是 Unix 时间戳设置时间:
public function preInsert(PropelPDO $con = null)
{
$this->setCreationDate(new DateTime('now', new DateTimeZone('UTC')));
return true;
}
我在数据库中获得了正确的 UTC 时间。
我检查了代码,发现 bahavior 设置了通过 Unix 时间戳的时间,因此导致数据库上的 UTC+1。
我的问题是:
- 是否可以在 UTC 中配置 Propel 可时间戳行为?
- 如果不是,Propel 在哪里设置日期格式/时区?是否使用
pre
钩子并传递具有DateTime
指定时区的对象是在数据库中获取 UTC 时间的唯一方法(除了实现自定义行为)? - 另外,如果我无法配置 Propel 可时间戳行为的时区,那么它的全部目的首先是什么?(在数据库中设置 UTC 时间戳是一种很常见的做法)