【问题标题】:How do you run a rake task at midnight of every single time zone?您如何在每个时区的午夜运行 rake 任务?
【发布时间】:2016-08-08 22:16:06
【问题描述】:
我想在用户所在地区的午夜时分对用户执行一些操作。由于我想支持时区而不是一切都基于服务器时间,所以我想涵盖每个时区所有可能的午夜。
到目前为止,我的想法是创建一个使用 cron 每小时触发一次的 rake 任务,并且该 rake 任务试图找出刚刚切换到午夜的时区。这是一种非常不可靠的方法,尤其是当时区进入 DST 时。
还有其他更可靠的方法可以做到这一点吗?
【问题讨论】:
标签:
ruby-on-rails
cron
timezone
rake
rake-task
【解决方案1】:
您可以使用tzinfo gem 浏览不同的时区,它支持夏令时。 Whenever gem 使您可以轻松地在 Ruby 中编写 cron 作业。我假设您的 User 模型有一个 timezone 列,该列遵循The Time Zone Database 命名。
所以,你的schedule.rb 会是这样的:
require "tzinfo"
def midnight_in_timezone(timezone)
# assumes your server runs in utc
TZInfo::Timezone.get(timezone.name).local_to_utc(Time.parse('00:00am')).strftime('%H:%M%p')
end
set :output, "/var/log/cron_log.log"
TZInfo::Timezone.all.each do |timezone|
every :day, :at => midnight_in_timezone(timezone) do
# pass in timezone so you can perform your task
# for users who match => User.where(timezone: timezone)
runner "SomeModel.run_your_midnight_task('#{timezone}')"
end
end