2011-10-17 40 views
9

請原諒,如果這是一個新手的問​​題:如何使用Ruby和MongoId正確保存時區?

我有一個應用程序,用戶可以在他們的個人資料中設置自己的時區。

當有人將一個系列(應用專用術語),我做了以下內容:

time = ActiveSupport::TimeZone.new(user.timezone).parse(
    "Wednesday, 26 October, 2011 13:30:00" 
) 

# This outputs: 2011-10-26 13:30:00 +0200 - valid according to the user selected TZ 

我然後保存陣容:

Lineup.create({ 
    :date => time.gmtime, 
    :uid => user._id, 
    :pid => product._id 
}) 

這應該(理論上)保存日期gmtime,但我在查看記錄時得到以下內容:

{ 
    "_id": ObjectId("4e9c6613e673454f93000002"), 
    "date": "Wed, 26 Oct 2011 13: 30: 00 +0200", 
    "uid": "4e9b81f6e673454c8a000001", 
    "pid": "4e9c6613e673454f93000001", 
    "created_at": "Mon, 17 Oct 2011 19: 29: 55 +0200" 
} 

正如你所看到的日期字段是wr ong - 它仍然保持用戶時區,它應該是GMT,而不是時區特定的。

如果我輸出time.gmtime,我得到正確的時間(應保存):

2011-10-26 11:30:00 UTC (correct) 

任何想法如何保存GMT日期,以便它實際上節省了GMT日期?

回答

11

看起來您需要指定日期屬性的字段類型。如果你想讓mongoid正確處理區域,我會使用Time字段。

class Lineup 
    include Mongoid::Document 
    field :date, type: Time 
end 

你也可能會想要設置的config/mongoid.yml

defaults: &defaults 
    use_utc: false 
    use_activesupport_time_zone: true 

這聽起來有悖常理以下,但這是使mongoid使用UTC作爲默認的時區當前的方式。

最後,看看mongoid-metastamp的寶石。它將爲您跨越多個時區查詢提供更好的支持,同時仍像本地時間字段一樣無縫工作。

+1

這也適用於當前版本的Mongoid(我在2.4.7)的DateTime。請參閱https://github.com/mongoid/mongoid/issues/1135 –