我試過行:在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?
但是如果在配置文件中設置,並且在視圖中,我想要香港時間,並且在進行數據庫查詢時,我需要本地時間(或UTC時間),所以我需要執行Time.zone ='...'在我調用strftime()之前?如果在我設置它之後即使它是非確定性的,它會被設置爲其他東西 - 如果它是非確定性的,那麼它可能隨時會重置爲配置文件中的任何內容? – 2011-04-04 05:12:35
如果我正確記得,Ruby時間庫的設計方式,您應該在程序開始時選擇您的「本地」時區,並且從那時起,唯一允許使用的DateTime對象必須是UTC或者必須在當地時間。查看DateTime上提供的功能:.utc和.local。他們沒有在時區X到時區Y之間轉換的通用函數。如果您想使用一堆不同的時區,那麼我認爲在打印之前,您必須在DateTime中添加或減去幾個小時。不要在視圖中設置Time.zone。 – 2011-04-06 04:58:03