2016-04-17 13 views
2

Ich möchte einige Aktionen für einen Benutzer ausführen, wenn es Mitternacht in seiner Region ist. Da ich Zeitzonen unterstützen möchte, anstatt alles auf Serverzeit zu setzen, möchte ich alle möglichen Mitternachten jeder Zeitzone abdecken.Wie führst du eine Rake-Aufgabe um Mitternacht jeder einzelnen Zeitzone aus?

Die Idee, die ich bisher hatte, ist eine Rake-Aufgabe zu erstellen, die jede Stunde mit Cron ausgelöst wird, und die Rake-Aufgabe versucht herauszufinden, welche Zeitzone gerade bis Mitternacht abgelaufen ist. Dies ist ein ziemlich unzuverlässiger Ansatz, insbesondere wenn eine Zeitzone in die Sommerzeit eintritt.

Gibt es andere zuverlässigere Möglichkeiten, dies zu erreichen?

Antwort

0

Sie können die tzinfo gem verwenden, um durch verschiedene Zeitzonen zu navigieren und es unterstützt DST. Die Whenever gem macht es einfach, Ihre Cron-Jobs in Ruby zu schreiben. Ich nehme an, Ihr Benutzermodell hat eine Zeitzonenspalte, die The Time Zone Database Benennung folgt.

Also, Ihr schedule.rb wäre so etwas wie dieses:

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