2011-04-04 17 views
0

我試過行:在Ruby on Rails中,從數據庫返回的非確定性數據?

last_item = Item.last 
last_item.created_at.strftime('%Y-%m-%d') 

,並在控制檯日誌中的SQL是:

SELECT "items".* FROM "items" ORDER BY items.id DESC LIMIT 1 

但有時我得到2011-04-03,有時候,2011-04-04

這是很奇怪的。如果我打印出來的時候,它是

孫,2011年4月3日17時58分48秒UTC +00:00

什麼給Rails 3中(3.0.5)這個不確定性的行爲?是時區嗎?但是我在瀏覽器中按下了Reload,這次它給了04-03,下一次它給了04-04而不重啓服務器或更改任何配置文件或源代碼。


更新:進一步調試表明,當它是04-04,然後使用p last_item.created_at打印的時間是:

星期一,2011年4月4日1點58分48秒HKT 08: 00

但我此行的觀點:

- Time.zone = 'Hong Kong' 

last_item.created_at.strftime('%Y-%m-%d')在控制器中完成。因此,控制器不應該先運行,並且在視圖中,我只是試圖使用不同的時區打印它...另外,爲什麼它有時會變成UTC,有時是HKT?

回答

1

我認爲在視圖中設置時區可能會導致這種非確定性行爲。您應該嘗試在config目錄中的某個位置設置您的時區,可能位於config/application.rb

+0

但是如果在配置文件中設置,並且在視圖中,我想要香港時間,並且在進行數據庫查詢時,我需要本地時間(或UTC時間),所以我需要執行Time.zone ='...'在我調用strftime()之前?如果在我設置它之後即使它是非確定性的,它會被設置爲其他東西 - 如果它是非確定性的,那麼它可能隨時會重置爲配置文件中的任何內容? – 2011-04-04 05:12:35

+0

如果我正確記得,Ruby時間庫的設計方式,您應該在程序開始時選擇您的「本地」時區,並且從那時起,唯一允許使用的DateTime對象必須是UTC或者必須在當地時間。查看DateTime上提供的功能:.utc和.local。他們沒有在時區X到時區Y之間轉換的通用函數。如果您想使用一堆不同的時區,那麼我認爲在打印之前,您必須在DateTime中添加或減去幾個小時。不要在視圖中設置Time.zone。 – 2011-04-06 04:58:03