module SidekiqScheduler::Utils
def self.calc_cron_run_time(cron, time)
-
(Time)
-
Parameters:
-
time
(Time
) -- -
cron
(Fugit::Cron
) --
def self.calc_cron_run_time(cron, time) time = time.floor # remove sub seconds to prevent rounding errors. return time if cron.match?(time) # If the time is a perfect match then return it. next_t = cron.next_time(time).to_t previous_t = cron.previous_time(time).to_t # The `time` var is some point between `previous_t` and `next_t`. # Figure out how far off we are from each side in seconds. next_diff = next_t - time previous_diff = time - previous_t if next_diff == previous_diff # In the event `time` is exactly between `previous_t` and `next_t` the diff will not be equal to # `cron.rough_frequency`. In that case we round down. cron.rough_frequency == next_diff ? time : previous_t elsif next_diff > previous_diff # We are closer to the previous run time so return that. previous_t else # We are closer to the next run time so return that. next_t end end