2012-12-12 32 views
1

我使用由dbcidump生成的DBIx :: Class架構進行插入和查詢。時區DateTime問題,DBIx :: Class和SQLite(休息時間5小時)

最近,我發現我所有的時間都比我們當地的時間(est)提前了+5小時。

在我Result類,我有__PACKAGE__->load_components("InflateColumn::DateTime"),其中列被定義爲"action_time", { data_type => "datetime", is_nullable => 0} ...

有沒有一種簡單的方法來使它這樣我可以控制的時區DateTime對象進行充氣/有這麼癟我的查詢和插入是否一致?

我曾嘗試將time_zone => 'local'添加到列定義中,但這沒有什麼區別。

例如:

  • 插入 2012年12月12日10時04分03秒
  • 檢索 2012年12月12日15時04分03秒

樣本數據:

sqlite> select datetime(action_time,'localtime'),action_time from actions order by id desc limit 3; 
2012-12-12 08:35:07|2012-12-12 13:35:07 
2012-12-12 08:34:45|2012-12-12 13:34:45 
2012-12-12 08:34:43|2012-12-12 13:34:43 

編輯:我相信這與我的使用有關: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/ResultClass/HashRefInflator.pm;從文檔:

列值通貨膨脹,例如,使用像DBIx :: Class :: InflateColumn :: DateTime模塊不會執行。返回的哈希包含原始數據庫值。

因此,我想知道如何讓該類爲日期時間字段做一些特殊的事情。

+0

此答案有幫助嗎? http://stackoverflow.com/a/2457601/21987 – Joel

+0

我在看那個,但它並沒有真正的他正在談論的例子。 – Blaskovicz

回答

4

您的時區可能爲America/New_York,與-0500(「EST」)不同,它遵循DST。

因爲這個原因,它不是一個適合存儲的時區。每年有120分鐘時間戳在這個時區將是模糊的。所以時間戳實際上以UTC存儲是有意義的。

如果您要使用DBIx::Class::InflateColumn::DateTime或者如果您從時間戳中明確創建DateTime對象,則可以將這些時間戳轉換爲您的時區或任何其他時間戳。

當使用將導致使用該模塊的模式生成器時,您可以指定一個選項(-o components='["InflateColumn::DateTime"]'用於dbicdump)。

+0

對不起,我不認爲我說得很清楚 - 我正在使用@ -o主題InflateColum :: DateTime @ thing for @ dbicdump @。我很感謝UTC的解釋,並認爲我會將我的api標記爲「返回UTC日期」以保持一致性。 – Blaskovicz