我正在开发一个应用程序,用户可以要求在他们的时区每天的特定时间发送电子邮件给他们。例如,用户A住在伦敦,每天在伦敦时间下午2点发送电子邮件,用户B住在纽约,在纽约时间下午2点发送电子邮件。
我想知道我应该如何在我的数据库中存储我的时间表时间戳,以及我需要存储哪些支持信息来支持所有时间依赖于特定时区的事实。
我认为将时间戳存储为utc,并为时区设置单独的列是可行的方法,但我不确定如何查询数据库以在特定时间返回所有预定的电子邮件,而无需每个时区执行一次查询。
是的,将数据存储在UTC - rails将默认这样做;在用户模型上添加一个time_zone
列
这是我写的一篇关于rails时区的文章,你可能会觉得有帮助:http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/
这可能过于复杂,但我想如果你有一个后台作业运行(delayed_job, sidekiq等),它会检查每个时区/电子邮件时间表-类似这样(你肯定想要time_zone在你的用户上,也许在时间表上?)
# loop through all timezones
ActiveSupport::TimeZone.zones_map(&:name).each do |time_zone|
# get a list of any saved schedules in this timezone
scheduled_in_zone = EmailSchedule.where(time_zone: time_zone)
# execute block in that timezone
Time.use_zone(time_zone) do
# Time.current is timezone aware (same as Time.zone.now)
now = Time.current
scheduled_in_zone.each do |scheduled|
if scheduled.deliver_at <= now
scheduled.deliver_it!
end
end
end
end
我还建议您查看:http://railscasts.com/episodes/106-time-zones-revised