【问题标题】:how can i get date of every 7th day from start date for a period of time我怎样才能得到从开始日期开始的每 7 天的日期一段时间
【发布时间】:2016-11-21 05:43:56
【问题描述】:

如何获取从开始日期开始的第 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 天运行一次的方法。如何获取下一个运行日期并检查我今天应该运行此通知的每一天?

【问题讨论】:

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


【解决方案1】:

要获取 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 进行重复计算。

【讨论】:

  • “请注意 Range 具有可识别时区的方法,例如 step_time_with_zone” - 您可以发布链接以供参考吗?
  • 对不起,弄乱了方法的名称。修复并添加了链接。
【解决方案2】:

我有一个类似的任务,我使用了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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2019-04-05
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多