当事件时间存储在不同的时区时,如何查询“现在”的事件?

时间:2012-06-18 18:19:25

标签: ruby-on-rails timezone mongoid

具体来说:我有一个附表模型,一个人可以在每天的同一时间每天安排一个活动。像这样:

class Schedule

  include Mongoid::Document
  include Mongoid::Timestamps 

  field :hour,      :type => Integer, :default => 8
  field :ampm,      :type => String,  :default => "am"
  field :time_zone, :type => String,  :default => "Eastern Time (US & Canada)"

  field :monday,    :type => Boolean, :default => true
  field :wednesday, :type => Boolean, :default => true
  field :friday,    :type => Boolean, :default => true

  field :tuesday,   :type => Boolean, :default => false
  field :thursday,  :type => Boolean, :default => false
  field :saturday,  :type => Boolean, :default => false
  field :sunday,    :type => Boolean, :default => false

  embedded_in :user

end

我有一个每小时运行的rake任务,我只想查询所有需要的事件和“现在”的事件。因此,例如,如果它是星期一的UTC中午,那么时间表为:timezone => EST和:hour => 7应该在结果中,如下表所示:timezone => PST和:小时=> 4.当然,比如星期二凌晨1点,因为这是星期一在太平洋标准时间/太平洋标准时间,这当然要棘手得多。

我认为只是将小时正常化,所以每个人都在使用utc但是这会让我在日常生活中变得一团糟,因为有人可能会在晚上11点安排一些事情,这实际上是我们的,所以“规范化”将成为一个完整的皮塔用户在其调度程序表单中选择的日期与我们存储在数据库中的日期不一致。

我正在使用mongoid,以防任何人有特定的mongoid解决方案。

1 个答案:

答案 0 :(得分:0)

如果不能以UTC格式保存日期,则必须单独查询每个时区。类似的东西:

wdays = [:sunday, :monday, :tuesday, :wednesday, :thursday, :friday, :saturday]
now = Time.now
TimeZone.all.each { |time_zone|
  remote_time = now.in_time_zone(time_zone)
  schedules = Schedules.where(
    :time_zone => time_zone.name,
    :hour => remote_time.strftime("%-l").to_i,
    :ampm => remote_time.strftime("%P"),
    wdays[remote_time.wday] => true,
  )
  # process schedules
}