如何使用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"
}

你可以看到日期字段是错误的-它仍然保持用户时区,它应该是GMT,而不是特定于时区。

如果我输出时间。gmtime,我得到了正确的时间(应该保存):

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

任何想法如何保存GMT日期,以便它实际上保存GMT日期?

看起来您需要指定date属性的字段类型。如果你想让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 gem。它将为跨多个时区的查询提供更好的支持,同时仍然像本地时间字段一样无缝工作。

相关内容

  • 没有找到相关文章

最新更新