如何从开始日期开始每隔7天获取一段时间的日期

时间:2016-07-18 14:47:59

标签: ruby-on-rails ruby ruby-on-rails-4

如何从开始日期开始每隔7天获取一段时间的日期。

我有一个调度程序应该在其开始日期时间设置为每个时区发送推送通知后每7天运行一次。

例如。

   start_time              run_every          end_time
20-july-2016 10:00:00      7_days       25-dec-2016 10:00:00

然后我将从20-july-2016 at 10 am. that will be 28-july, 4-aug, 11-aug and so on.

每7天运行一次调度程序

问题是它应该针对所有时区运行,以便澳大利亚用户可以在2016年7月20日10:00:00收到通知,美国用户也应该在2016年7月20日获得通知10: 00:00。

因为我在start_date, start_date+1.days, start_date-1.days上运行调度程序,因为我的服务器是UTC时区,所以它可以占用每个时区的上午10点。

我无法找到一种方法来间隔7天运行它。如何才能获得下一个运行日期并检查我今天应该运行此通知的每一天?

2 个答案:

答案 0 :(得分:4)

要获取UTC中的运行日期列表,您可以使用:

(1.month.ago.utc.to_i..1.week.from_now.utc.to_i).
  step(7.days).
  map { |v| Time.at(v).utc }

# => [2016-06-18 17:27:18 UTC, 2016-06-25 17:27:18 UTC, 2016-07-02 17:27:18 UTC, 2016-07-09 17:27:18 UTC, 2016-07-16 17:27:18 UTC, 2016-07-23 17:27:18 UTC]

从这一点开始,您应该可以执行任何您喜欢的时区调整。请注意,Range具有时区感知方法,例如step_with_time_with_zone

另外,您可能需要考虑使用whenever gem进行cron调度(如果使用)或ice_cube gem进行递归计算。

答案 1 :(得分:3)

我有类似的任务,我使用了ice_cube gem,这使“重复发生的事件”更容易处理。

Daily example

# every third day
schedule = Schedule.new(Time.now)
schedule.add_recurrence_rule IceCube::Rule.daily(3)

# Occurrences until a time
schedule.occurrences Time.tomorrow