2013-01-16 32 views
0

我正在使用Propel 1.6和MySql。我把我的所有表timestampable行爲如下:在UTC推進時間戳行爲

<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> 

按照行走timestampable行爲documentation,沒有參數指定的時區。

我注意到timestampable行爲默認情況下不設置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。

我的問題是:

  1. 是否有可能配置UTC的行走timestampable行爲?
  2. 如果不是,Propel在哪裏設置日期格式/時區?是否使用pre鉤子並將指定時區的DateTime對象傳遞給在數據庫中獲取UTC時間的唯一方法(實現自定義行爲除外)?
  3. 另外,如果我無法配置Propel時間戳行爲的時區,首先它的整體目的是什麼? (這是一個很常見的做法是將數據庫中的UTC時間戳)

回答

0

文檔沒有具體提及的時區,但你應該能夠把它做這樣的事情......

$objSourceTimezone = new DateTimeZone('America/Los_Angeles'); 
$objDestinationTimezone = new DateTimeZone('UTC'); 

$objTime = new DateTime([some date], $objSourceTimezone); 
$objTime->setTimeZone($objDestinationTimezone); 

$objPropel->setTimestamp($time->format('Y-m-d H:i:s')); 

我使用我的本地太平洋時區(但您可以使用任何您想要的)並將其轉換爲與MySQL和Propel的TIMESTAMP列兼容的UTC格式。

您可以檢索這些數據,並通過做相反在不同的時區顯示它...

$objSourceTimezone = new DateTimeZone('UTC'); 
$objDestinationTimezone = new DateTimeZone('America/New_York'); 

$objTime = new DateTime($objPropel->getTimestamp(), $objSourceTimezone); 
$objTime->setTimeZone($objDestinationTimezone); 

print $time->format('Y-m-d H:i:s').」\n」; 
+0

您能否澄清幾點......第一塊代碼應該在哪裏執行?例如,如果它應該在'preInsert()'鉤子中執行,這與我在我的問題中提到的類似,並且它沒有使用時間戳行爲。什麼是$ objPropel?它是一個ActiveRecord模型對象嗎? –

0

this questionphp documentation for time()很顯然,time()應該是自Unix紀元返回秒,它將始終使用UTC。事實上,在我使用Propel和時間戳行爲的所有項目中都是如此。如果你的項目沒有這樣做,可能會有更深層次的問題(也就是說,這在Propel中不是問題)。這就是說,我的問題的答案是:

  1. 的行爲使用time()它總是在每個PHP文檔UTC。
  2. 請參閱(1),並且不,Propel沒有此類時區設置(儘管PHP does,但它不用於time(),而是用mktime()代替)。如果您必須這樣做,我認爲您的preInsert()掛鉤應該可以很好地解決問題。
  3. 參見(1),時間戳行爲是非常簡單的,只是使用time(),但你可以隨時寫自己的!事實上,您可以複製existing behavior file,然後將其添加到您的構建屬性(Propel doc for custom behaviors)。

祝你好運!