具体来说:我有一个日程安排模型,一个人可以在每天的同一时间每天安排一个事件。喜欢这个:
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
我有一个每小时运行的耙子任务,我只想查询所有需要和"现在"事件的计划。 因此,例如,如果是星期一的中午 UTC,则结果中应该包含 :timezone => EST 和 :hour => 7 的计划,以及 :timezone => PST 和 :hour => 4 的计划。 当然,当它是星期二凌晨 1 点 UTC 时,这要棘手得多,因为那是太平洋标准时间/美国东部标准时间的星期一。
我想过只是规范化小时,所以每个人都在 UTC上,但这会给我带来混乱,因为有人可能会在周三晚上 11 点安排一些事情,实际上是周四 UTC,所以"规范化"将成为一个总皮塔,用户在他们的调度程序表单中选择的天数与我们存储在数据库中的天数不对应。
我正在使用 mongoid,以防有人有 mongoid 特定的解决方案。
如果无法以 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
}