2012-10-16 17 views
1

我今年參加了Rails Rumble,我發現自己被時區問題糾纏在一起。Rails 3.2.8 - 如何處理時區?

我上傳了我的應用程序在林德,我住在美國東部時區或-4到UTC。

我有一個模型,它通過執行以下操作保存的東西:

def self.processing_creation(user_id, home_id, chore_id) 
    registered_chore = RegisteredChore.where("DATE(created_at) = ?", Date.today).find_by_user_id_and_home_id_and_chore_id(user_id, home_id, chore_id) 
    unless registered_chore 
    registered_chore = RegisteredChore.create(user_id: user_id, home_id: home_id, chore_id: chore_id, created_at: Time.zone.now) 
    user = registered_chore.user 
    user.add_one_chore_point 
    end 
    registered_chore 
end 

RegisteredChore.where( 「?DATE(created_at)=」,Date.today).find_by_user_id_and_home_id_and_chore_id(USER_ID,HOME_ID,chore_id)

即使數據剛剛創建,也會返回false。

我注意到「創建」以UTC保存,但Date.today使用用戶的本地時區。

處理這個問題的最佳方法是什麼?

另一個例子來說明這個問題:

  1. 我想在美國東部時間11點註冊一個苦差事。
  2. 服務器已在第二天(例如:12)。
  3. Rails在第二天的日期保存數據(12)。
  4. 但是用戶仍然在第11天。
  5. 從技術上說,用戶使用當前方法可以再次保存條目,因爲日期與數據庫和用戶界面不同。

如何解決這個問題?

回答

1

默認情況下,Rails將按UTC保存到數據庫的時間。如果您使用的是DATE([Date.today]),那麼它將在11日查找記錄,而不是12日。要獲得正確的日期,您可能需要將Time.zone設置爲用戶當前的時區,然後執行查詢。

我建立了一個名爲by_star的寶石來處理這種日期搜索,我估計你應該使用它。有了它,您的查詢會是這樣:

RegisteredChore.today.where(:user_id => user.id, 
          :home_id => home.id, 
          :chore_id => chore.id) 
1

的Rails 3默認保存在數據庫中相對GMT + 00所有的時間:00時區。因此,根據您的時區計算時間,您必須設置偏移量。否則,您可以通過添加以下內容來更改默認的Activerecord時區:application.rb

config.time_zone = 'Your time zone' (Example: 'Eastern Time (US & Canada)') 
config.active_record.default_timezone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')