【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多