【问题标题】:How to save a timezone correctly with Ruby and MongoId?如何使用 Ruby 和 MongoId 正确保存时区?
【发布时间】:2011-12-09 11:51:45
【问题描述】:

如果这是一个菜鸟问题,请原谅:

我有一个应用程序,用户可以在其个人资料中设置自己的时区。

当有人添加阵容(应用特定术语)时,我会执行以下操作:

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,而不是特定于时区。

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

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

任何想法如何保存格林威治标准时间日期,以便它实际保存格林威治标准时间日期?

【问题讨论】:

    标签: ruby mongodb time timezone mongoid


    【解决方案1】:

    您似乎需要指定日期属性的字段类型。如果您希望 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。它将为您提供更好的跨时区查询支持,同时仍能像原生时间字段一样无缝工作。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多