gem installiere ice_cube
ice_cube ist eine Ruby-Bibliothek zur einfachen Handhabung wiederholter Ereignisse (Zeitpläne). Die API ist iCalendar-Ereignissen nachempfunden und verfügt über eine angenehme Ruby-Syntax. Die Stärke liegt in der Möglichkeit, mehrere Regeln festzulegen und Ice_cube schnell herausfinden zu lassen, ob der Zeitplan auf ein bestimmtes Datum fällt (.occurs_on?) oder zu welchen Zeiten er stattfindet (.occurrences, .first, .all_occurrences).
Stellen Sie sich vor, Sie möchten:
Jeden Freitag, den 13., der im Oktober fällt
Du würdest schreiben:
Schedule = IceCube::Schedule.newschedule.add_recurrence_rule( IceCube::Rule.yearly.day_of_month(13).day(:friday).month_of_year(:october))
Präsentation von Lone Star Ruby Conf (Folien, YouTube)
Kurze Einführung
Dokumentationswebsite
Mit ice_cube können Sie Folgendes angeben (in aufsteigender Reihenfolge):
Wiederholungsregeln – Regeln zum Einbeziehen wiederkehrender Zeiten in einen Zeitplan
Wiederholungszeiten – Zur gezielten Aufnahme in einen Zeitplan
Ausnahmezeiten – Um sie gezielt von einem Zeitplan auszuschließen
Beispiel: Angabe einer Wiederholung mit einer Ausnahmezeit. Erfordert „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# Vorkommen bis end_time auflisten (end_time wird für nicht terminierende Regeln benötigt)occurrences = scheme.occurrences(end_time) # [now]# oder alle Vorkommen (nur für terminierende Zeitpläne) Vorkommnisse = Schedule.all_Occurrences # [jetzt, jetzt + 2. Tage, jetzt + 3. Tage]# oder nur eine einzelne überprüfen timeschedule.occurs_at?(now + 1.day) # falseschedule.occurs_at?(now + 2.days) # true# oder nur einen einzelnen Tag prüfenchedule.occurs_on?(Date.today) # true# oder prüfen, ob er zwischen zwei liegt Datesschedule.occurs_between?(now, now + 30.days) # trueschedule.occurs_between?(now + 4.days, now + 30.days) # false# oder die ersten (n) Vorkommnisseschedule.first(2) # [now, now + 2.days]schedule.first # now# oder die letzten (n) Vorkommnisse (falls der Zeitplan endet)schedule.last(2) # [now + 2.days, now + 3.days]schedule.last # now + 3.days# oder am nächsten Vorkommnisseschedule.next_occurrence(from_time) # Standardmäßig ist Time.nowschedule.next_occurrences(4, from_time) # Standardmäßig ist Time.nowschedule.remaining_occurrences # zum Beenden von Zeitplänen# oder der vorherigen Vorkommenschedule. previous_occurrence(from_time)schedule. previous_occurrences(4, from_time)# oder schließen Sie frühere Ereignisse mit einer Dauer ein überlappend from_timeschedule.next_occurrences(4, from_time, spans: true)schedule.occurrences_between(from_time, to_time, spans: true)# oder geben Sie dem Zeitplan eine Dauer und fragen Sie, obcreasing_at?schedule = IceCube::Schedule.new(now, duration: 3600)schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_between?(t1, t2)# mit end_time wird auch die Dauer festgelegtschedul = 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# Kontrolle übernehmen und iterationschedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until( Datum.heute + 30)schedule.each_occurrence { |t| setzt t }
Der Grund dafür, dass Zeitpläne Dauer und keine individuellen Regeln haben, besteht darin, die Kompatibilität mit dem ical RFC aufrechtzuerhalten: http://www.kanzaki.com/docs/ical/rrule.html
Um Zeitpläne einzuschränken, verwenden Sie count
oder until
für die Wiederholungsregeln. Durch Festlegen von end_time
im Zeitplan wird lediglich die Dauer (ab der Startzeit) für jedes Vorkommen festgelegt.
ice_cube funktioniert hervorragend ohne ActiveSupport, unterstützt aber nur die einzelne „lokale“ Zeitzone der Umgebung ( ENV['TZ']
) oder UTC. Um mehrere Zeitzonen korrekt zu unterstützen (insbesondere für die Sommerzeit), sollten Sie „active_support/time“ benötigen.
Die Vorkommnisse eines Zeitplans werden in derselben Klasse und Zeitzone wie die start_time des Zeitplans zurückgegeben. Die Startzeiten des Zeitplans werden wie folgt unterstützt:
Time.local (Standard, wenn keine Zeit angegeben ist)
Zeit.utc
ActiveSupport::TimeWithZone (mit Time.zone.now
, Time.zone.local
, time.in_time_zone(tz)
)
DateTime (veraltet) und Date werden in eine Time.local konvertiert
ice_cube implementiert sein eigenes Hash-basiertes .to_yaml, sodass Sie Zeitplanobjekte schnell (und sicher) in Ihren Datenspeicher und aus diesem heraus serialisieren können
Es unterstützt auch die teilweise Serialisierung zu/von ICAL
. Das Parsen von Datums- und Uhrzeitangaben mit Zeitzoneninformationen wird derzeit nicht unterstützt.
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 kann ical- oder string-Darstellungen einzelner Regeln oder des gesamten Zeitplans bereitstellen.
Rule = IceCube::Rule.daily(2).day_of_week(Tuesday: [1, -1], Wednesday: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # 'Alle 2 Tage am letzten und 1. Dienstag und am 2. Mittwoch'
Es gibt viele Arten von Wiederholungsregeln, die einem Zeitplan hinzugefügt werden können:
# alle Tagechedule.add_recurrence_rule IceCube::Rule.daily# alle dritten Tagechedule.add_recurrence_rule IceCube::Rule.daily(3)
# jede Wochechedule.add_recurrence_rule IceCube::Rule.weekly# jede zweite Woche am Montag und Dienstagschedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:monday, :tuesday)# für programmatische Bequemlichkeit (wie oben)Schedule. add_recurrence_rule IceCube::Rule.weekly(2).day(1, 2)# Angabe eines wöchentlichen Intervalls mit einem anderen ersten Wochentag (standardmäßig Sonntag)schedule.add_recurrence_rule IceCube::Rule.weekly(1, :monday)
# jeden Monat am ersten und letzten Tag des Monatschedule.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# jeden zweiten Monat am 15. des Monatschedule.add_recurrence_rule IceCube::Rule.monthly(2). day_of_month(15)
Monatliche Regeln überspringen Monate, die für den angegebenen Tag des Monats zu kurz sind (z. B. keine Vorkommen im Februar für day_of_month(31)
).
# jeden Monat am ersten und letzten Dienstag des Monatschedule.add_recurrence_rule IceCube::Rule.monthly.day_of_week(tuesday: [1, -1])# jeden zweiten Monat am ersten Montag und letzten Dienstagschedule.add_recurrence_rule IceCube::Rule. monatlich(2).day_of_week( Montag: [1], tuesday: [-1])# für programmatische Bequemlichkeit (wie oben)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# jedes Jahr am 100. Tag ab Beginn und Ende des Jahreschedule.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# jedes vierte Jahr am Silvesterabendchedule.add_recurrence_rule IceCube::Rule.yearly(4) .day_of_year(-1)
# jedes Jahr am selben Tag wie start_time, aber im Januar und Februarschedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# jedes dritte Jahr im Märzschedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year (:march)# für programmatische Bequemlichkeit (dasselbe wie oben)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# jede Stunde in derselben Minute und Sekunde wie die Startdatenchedule.add_recurrence_rule IceCube::Rule.hourly# jede zweite Stunde, am Montagschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# alle 10 Minutenschedule.add_recurrence_rule IceCube::Rule.minutely(10)# alle anderthalb Stunden, am letzten Dienstag des Monatschedule.add_recurrence_rule IceCube::Rule.minutely(90).day_of_week(tuesday: [-1])
# alle Sekundenchedule.add_recurrence_rule IceCube::Rule.secondly# alle 15 Sekunden zwischen 12:00 und 12:59schedule.add_recurrence_rule IceCube::Rule.secondly(15).hour_of_day(12)
Das Team von GetJobber verfügt über Open-Source-RecurringSelect, das die Arbeit mit IceCube in einer Rails-App durch einige nette Helfer erleichtert.
Schauen Sie es sich unter https://github.com/GetJobber/recurring_select an
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
Verwenden Sie den GitHub-Issue-Tracker
Beiträge sind willkommen – ich verwende GitHub für die Problemverfolgung (Begleitung fehlgeschlagener Tests ist großartig) und für Funktionsanfragen
Per Fork und Pull-Request einreichen (einschließlich Tests)
Wenn Sie an etwas Großem arbeiten, schreiben Sie mir vorher eine Nachricht