您如何 运行 在每个时区的午夜执行抽佣任务?

How do you run a rake task at midnight of every single time zone?

我想在用户所在地区的午夜时分对用户执行一些操作。因为我想支持时区而不是基于服务器时间的一切,所以我想涵盖每个时区所有可能的午夜。

到目前为止,我的想法是创建一个使用 cron 每小时触发一次的 rake 任务,并且 rake 任务试图弄清楚哪个时区刚到午夜。这是一种非常不可靠的方法,尤其是当时区进入夏令时时。

还有其他更可靠的方法来实现吗?

您可以使用tzinfo gem to navigate through different timezones and it supports DST. The Whenever gem makes it easy to write your cron jobs in Ruby. I assume your User model has a timezone column which follows 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