宝石安装ice_cube
ice_cube 是一个 ruby 库,用于轻松处理重复事件(时间表)。该 API 是根据 iCalendar 事件建模的,采用令人愉快的 Ruby 语法。其强大之处在于能够指定多个规则,并让ice_cube快速确定计划是否在某个日期(.occurrences_on?),或者它发生在什么时间(.occurrences,.first,.all_occurrences)。
想象一下你想要:
10 月 13 日的每个星期五
你会写:
日程 = IceCube::Schedule.newschedule.add_recurrence_rule( IceCube::Rule.yearly.day_of_month(13).day(:friday).month_of_year(:october))
Lone Star Ruby Conf 的演示(幻灯片、YouTube)
快速介绍
文档网站
使用ice_cube,您可以指定(按优先级递增的顺序):
重复规则 - 有关如何在计划中包含重复时间的规则
重复次数 - 特别包含在时间表中
例外时间 - 从时间表中明确排除
示例:指定具有例外时间的重复。需要“rails/activesupport”( gem install 'activesupport'
)。
需要 'ice_cube' 需要 'active_support/time'schedule = IceCube::Schedule.new(now = Time.now) do |s| s.add_recurrence_rule(IceCube::Rule.daily.count(4)) s.add_exception_time(now + 1.day)end# 列出 end_time 之前的出现次数(非终止规则需要 end_time)occurrences = Schedule.occurrences(end_time) # [now]# 或所有出现次数(仅适用于终止计划) occurrences = Schedule.all_occurrences # [now, now + 2.days, now + 3.days]# 或仅检查单个timeschedule.occurrs_at?(now + 1.day) # falseschedule.occurrs_at?(now + 2.days) # true# 或仅检查单个日期chedule.occurrs_on?(Date.today) # true# 或检查它是否发生在两个日期之间dateschedule.occurrs_ Between?(now, now + 30.days) # trueschedule.occurrs_ Between?(now + 4.days, now + 30.days) # false# 或前 (n) 次出现schedule.first(2) # [now, now + 2.days]schedule.first # now# 或最后 (n) 次出现(如果计划终止)schedule. last(2) # [now + 2.days, now + 3.days]schedule.last # now + 3.days# 或下一个occurrenceschedule.next_occurrence(from_time) # 默认为 Time.nowschedule.next_occurrences(4, from_time) # 默认为 Time.nowschedule.remaining_occurrences # 用于终止计划# 或之前的 eventschedule.previous_occurrence(from_time)schedule.previous_occurrences(4, from_time)#或包括之前发生的持续时间重叠的事件from_timeschedule.next_occurrences(4, from_time, spans: true)schedule.occurrences_ Between(from_time, to_time, spans: true)# 或者给时间表一个持续时间并询问是否occurring_at?schedule = IceCube::Schedule.new(now,uration: 3600 )schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_ Between?(t1, t2)# using end_time 还设置durationschedule = IceCube::Schedule.new(start = Time.now, end_time: start + 3600 )schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(start + 3599) # trueschedule.occurring_at?(start + 3600) # false# 控制并使用 iterationschedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until( Date.today + 30)schedule.each_occurrence { |t|把 t }
时间表有持续时间而不是单独的规则的原因是为了保持与 ical RFC 的兼容性:http://www.kanzaki.com/docs/ical/rrule.html
要限制计划,请在重复规则上使用count
或until
。在计划上设置end_time
只是设置每次发生的持续时间(从开始时间开始)。
Ice_cube 在没有 ActiveSupport 的情况下也能很好地工作,但仅支持环境的单个“本地”时区 ( ENV['TZ']
) 或 UTC。要正确支持多个时区(尤其是 DST),您应该需要“active_support/time”。
计划的事件将在与计划的 start_time 相同的类和时区中返回。支持计划开始时间:
Time.local(未指定时间时的默认值)
UTC 时间
ActiveSupport::TimeWithZone (使用Time.zone.now
、 Time.zone.local
、 time.in_time_zone(tz)
)
DateTime(已弃用)和 Date 转换为 Time.local
ice_cube 实现了自己的基于哈希的 .to_yaml,因此您可以快速(安全)地将计划对象序列化进出数据存储
它还支持与ICAL
之间的部分序列化。目前不支持使用时区信息解析日期时间。
yaml = Schedule.to_yamlIceCube::Schedule.from_yaml(yaml)hash = Schedule.to_hashIceCube::Schedule.from_hash(hash)ical = Schedule.to_icalIceCube::Schedule.from_ical(ical)
ice_cube 可以提供单个规则或整个时间表的 ical 或字符串表示。
Rule = IceCube::Rule.daily(2).day_of_week(星期二: [1, -1], 星期三: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # '每两天的最后一个和第一个星期二以及第二个星期三'
可以将多种类型的重复规则添加到计划中:
# 每几天chedule.add_recurrence_rule IceCube::Rule.daily# 每三天chedule.add_recurrence_rule IceCube::Rule.daily(3)
# 每星期chedule.add_recurrence_rule IceCube::Rule.weekly# 每隔一周的星期一和星期二schedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:monday, :tuesday)# 为了编程方便(与上面相同)安排。 add_recurrence_rule IceCube::Rule.weekly(2).day(1, 2)# 指定每周具有不同第一个工作日的时间间隔(默认为星期日)schedule.add_recurrence_rule IceCube::Rule.weekly(1, :monday)
# 每个月每月的第一天和最后一天chedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# 每隔一个月的每月15号chedule.add_recurrence_rule IceCube::Rule.monthly(2)。月份中的某一天(15)
每月规则将跳过对于指定月份而言太短的月份(例如,二月份没有出现day_of_month(31)
)。
# 每个月的第一个和最后一个星期二chedule.add_recurrence_rule IceCube::Rule.monthly.day_of_week(tuesday: [1, -1])# 每隔一个月的第一个星期一和最后一个星期二schedule.add_recurrence_rule IceCube::Rule.每月(2).day_of_week( 星期一:[1], 星期二: [-1])# 为了编程方便(与上面相同)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# 每年从年份开始到结束的第 100 天chedule.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# 每第四年新年除夕chedule.add_recurrence_rule IceCube::Rule.yearly(4) .day_of_year(-1)
# 每年与 start_time 同一天,但在 1 月和 2 月schedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# 每三年 Marchschedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year (:march)# 为了编程方便(与上面)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# 每小时与开始日期相同的分钟和秒chedule.add_recurrence_rule IceCube::Rule.hourly# 每隔一小时,在星期一sschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# 每 10 分钟schedule.add_recurrence_rule IceCube::Rule.monthly(10)# 每一个半小时,每月的最后一个星期二chedule.add_recurrence_rule IceCube::Rule.monthly(90).day_of_week(tuesday: [-1])
# 每秒chedule.add_recurrence_rule IceCube::Rule.secondly# 12:00 - 12:59之间每15秒schedule.add_recurrence_rule IceCube::Rule.secondly(15).hour_of_day(12)
GetJobber 的团队开源了 RecurringSelect,这使得通过一些不错的助手在 Rails 应用程序中使用 IceCube 变得更加容易。
请访问 https://github.com/GetJobber/recurring_select 查看
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
使用 GitHub 问题跟踪器
欢迎贡献 - 我使用 GitHub 进行问题跟踪(伴随失败的测试很棒)和功能请求
通过分叉和拉取请求提交(包括测试)
如果你正在做一些重大的事情,请提前给我发消息