我希望在用户午夜时对他或她的区域执行某些操作。由于我想支持时区而不是基于服务器时间,所以我希望涵盖每个时区的所有可能的中午。
我到目前为止的想法是创建一个使用cron每小时触发的rake任务,并且rake任务试图找出刚刚勾选到午夜的时区。这是一种非常不可靠的方法,特别是当时区进入夏令时时。
还有其他更可靠的方法来实现这一目标吗?
答案 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