你如何在每个时区的午夜运行一个rake任务?

时间:2016-04-17 04:10:11

标签: ruby-on-rails cron timezone rake rake-task

我希望在用户午夜时对他或她的区域执行某些操作。由于我想支持时区而不是基于服务器时间,所以我希望涵盖每个时区的所有可能的中午。

我到目前为止的想法是创建一个使用cron每小时触发的rake任务,并且rake任务试图找出刚刚勾选到午夜的时区。这是一种非常不可靠的方法,特别是当时区进入夏令时时。

还有其他更可靠的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

您可以使用tzinfo gem浏览不同的时区,并支持DST。 Whenever gem使您可以轻松地在Ruby中编写cron作业。我假设您的用户模型有一个时区列,其后面是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