gem インストール Ice_cube
Ice_cubeは、繰り返し行われるイベント(スケジュール)を簡単に扱うためのRubyライブラリです。 API は、快適な Ruby 構文で iCalendar イベントをモデル化しています。その機能は、複数のルールを指定し、スケジュールが特定の日付 (.occurs_on?) に該当するか、またはスケジュールがいつ発生するか (.occurrences、.first、.all_occurrences) を Ice_cube に迅速に判断させる機能にあります。
あなたが望むことを想像してみてください:
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)
簡単な紹介
ドキュメント Web サイト
Ice_cube を使用すると、(優先順位の高い順に) 以下を指定できます。
繰り返しルール - スケジュールに繰り返し時間を含める方法に関するルール
繰り返し回数 - スケジュールに具体的に含めるには
例外時間 - スケジュールから具体的に除外します。
例: 例外時間を指定して繰り返しを指定します。 「rails/activesupport」( gem install 'activesupport'
)が必要です。
require 'ice_cube'require '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]# または、 single dayschedule.occurs_at?(now + 1.day) # falseschedule.occurs_at?(now + 2.days) # true# または単一の dayschedule.occurs_on?(Date.today) # true# またはそれが次の期間に発生するかどうかを確認します2 つの日付schedule.occurs_between?(now、now + 30.days) # trueschedule.occurs_between?(now + 4.days、now + 30.days) # false# または最初 (n) 回の発生schedule.first(2) # [now, now + 2.days]schedule.first # now# または最後の (n) 回の発生 (スケジュールが終了する場合)schedule.last(2) # [現在 + 2.日、現在 + 3.日]schedule.last # 現在 + 3.日# または次occurrenceschedule.next_occurrence(from_time) # デフォルトは Time.nowschedule.next_occurrences(4, from_time) # デフォルトは Time.nowschedule.remaining_occurrences # スケジュールを終了する場合# または前のoccurrenceschedule.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)# または、スケジュールに期間を指定して、occurrence_at?schedule = IceCube::Schedule.new(now, period : 3600)スケジュール.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_between?(t1, t2)# 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(日付.今日 + 30) スケジュール.それぞれの発生 { |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 = スケジュール.to_yamlIceCube::Schedule.from_yaml(yaml)hash = スケジュール.to_hashIceCube::Schedule.from_hash(hash)ical = スケジュール.to_icalIceCube::Schedule.from_ical(ical)
Ice_cube は、個々のルールまたはスケジュール全体の ical または文字列表現を提供できます。
ルール = IceCube::Rule.daily(2).day_of_week(火曜日: [1, -1], 水曜日: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # '2日おきの最終火曜日と第1火曜日と第2水曜日'
スケジュールに追加できる繰り返しルールにはさまざまな種類があります。
# 毎日スケジュール.add_recurrence_rule IceCube::Rule.daily# 3 日ごとスケジュール.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)
# 毎月、months の最初と最後の日chedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# 隔月の monthschedule.add_recurrence_rule IceCube::Rule.monthly(2)月の日(15)
月次ルールでは、指定した日にちが短すぎる月はスキップされます (たとえば、2 月にはday_of_month(31)
が出現しません)。
# 毎月、monthsの最初と最後の火曜日にスケジュール.add_recurrence_rule IceCube::Rule.monthly.day_of_week(tuesday: [1, -1])# 隔月で最初の月曜日と最後の火曜日にschedule.add_recurrence_rule IceCube::Rule.毎月(2).曜日( 月曜日: [1]、 tuesday: [-1])# プログラム上の便宜のため (上記と同じ)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# 毎年、年の初めと終わりから 100 日目にスケジュール.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# 4 年ごとの大晦日にスケジュール.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)# 3 年ごとに 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# 隔時間、月曜日にschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# 10 分ごとschedule.add_recurrence_rule IceCube::Rule.minoutly(10)# 1 時間半ごと、月の最後の火曜日chedule.add_recurrence_rule IceCube::Rule.minoutly(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/quirting_select で確認してください。
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
GitHub 問題トラッカーを使用する
貢献は大歓迎です - 私は問題の追跡 (テストの失敗は素晴らしいことです) と機能のリクエストに GitHub を使用しています
フォークとプルリクエストを介して送信します(テストを含む)
何か大きなことに取り組んでいる場合は、事前にメッセージを送ってください