2011-10-17 14 views
9

これはちょっと面白いことですが、noobの問題の場合は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でなければなりません。

I出力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 

はまた、おそらく設定/ mongoid.yml

defaults: &defaults 
    use_utc: false 
    use_activesupport_time_zone: true 

これは直感に反する聞こえる中で次のように設定したいと思うでしょうが、これはデフォルトのタイムゾーンとしてmongoid利用UTCを作るための現在の方法です。

最後に、mongoid-metastamp gemを見てください。それは、ネイティブのTimeフィールドのようにシームレスに動作しながら、複数のタイムゾーンを照会するためのサポートを提供します。

+1

これは、現在のバージョンのモンゴイでもDateTimeで動作します(私は2.4.7です)。 https://github.com/mongoid/mongoid/issues/1135を参照してください。 –

関連する問題