寶石安裝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.occurrences_at?(now + 1.day) # falseschedule.occurrence_at?(now + 2.days) # true# 或僅檢查單一日期chedule.occurrs_on?(Date.today) # true# 或檢查它是否發生在兩個日期之間schedule.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# 或下次發生schedule.next_occurrence(from_time) # 默認為Time.nowschedule.next_occurrences( 4, from_time) # 預設為Time.nowschedule.remaining_occurrences # 用於終止計畫# 或先前的事件schedule.previous_occurrence(from_time)schedule.previous_occurrences(4, from_time)schedule.previous_occurrences(4, 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 = IceCubeCube ,uration: 3600)schedule.add_recurrence_rule IceCube:: Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_ Between?(t1, t2)# using end_time 也設定 Timeduration水平. .now, end_time: start + 3600) 時間表。 newschedule.add_recurrence_rule IceCube::Rule.daily.until (日期.今天 + 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)# 為了編程方便(與上面相同)安排。 :monday)
# 每個月每月的第一天和最後一天chedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# 每隔一個月的每月15號chedule.add_recurrence_rule IceCube::Rule.monthly( 2)。
每月規則將跳過指定月份而言太短的月份(例如,二月沒有出現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_ofyear( -1)
# 每年與 start_time 同一天,但在 1 月和 2 月schedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# 每三年 Marchschedule.add_recurrence_ruleCube::Rule.year Icely(3). (: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 進行問題追蹤(伴隨失敗的測試很棒)和功能請求
透過分叉和拉取請求提交(包括測試)
如果你正在做一些重大的事情,請提前給我發訊息