【问题标题】:How to query for events that are "now" when event times are stored in different timezones?当事件时间存储在不同时区时,如何查询“现在”的事件?
【发布时间】:2012-06-20 18:26:18
【问题描述】:

具体来说:我有一个计划模型,一个人可以每天在同一时间安排一个事件。像这样:

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 和 :hour => 4 的时间表。这当然,在世界标准时间星期二凌晨 1 点时会更棘手,因为那是太平洋标准时间/东部标准时间的星期一。

我想过只是将时间标准化,以便每个人都使用 UTC,但这会给我的日子造成混乱,因为有人可能会在周三晚上 11 点安排一些事情,这实际上是 UTC 时间,所以“标准化”将成为一个总的皮塔,其中用户在他们的调度程序表单中选择的天数与我们存储在数据库中的天数不对应。

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

【问题讨论】:

  • "EST" 不是时区。它是时区的部分 - 太平洋时间的标准时间部分。听起来您想将每个事件的本地时间转换为 UTC,并将其与当前的 UTC 时间进行比较。
  • 我意识到,我在缩写。我希望有办法避免转换。
  • 在这类事情中很重要。 EST 有特定的含义,并不是你想要的含义。您可能会以另一种方式进行转换 - 在您感兴趣的每个时区中计算当前日期/时间,但您将不得不进行 some 类型的转换。此外,请注意出现两次或由于 DST 转换而被跳过的本地时间。

标签: ruby-on-rails timezone mongoid


【解决方案1】:

如果不能以 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
}

【讨论】:

  • 我考虑过这一点,但由于有 142 个时区,我避开了该解决方案。在我每小时对这么多查询的真正影响进行一次基准测试之后,最终可能会是我所做的。听起来我关于存在一些超级棘手的查询的问题的基本答案是:不,你不能这样做。
  • 您可以按 UTC-offset 对时区进行分组,该时区有 33 个偏移量。由于存在偏移量为 :30 和 :45 的时区,因此您可以每一刻钟分别运行 25、0、7 和 1 个查询的脚本。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 2014-03-30
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多