อัญมณีติดตั้ง ice_cube
ice_cube เป็นไลบรารีทับทิมสำหรับจัดการเหตุการณ์ซ้ำ (กำหนดการ) ได้อย่างง่ายดาย API ได้รับการจำลองตามเหตุการณ์ iCalendar ในรูปแบบ Ruby ที่น่าพอใจ พลังอยู่ที่ความสามารถในการระบุกฎหลายข้อ และให้ ice_cube ทราบได้อย่างรวดเร็วว่ากำหนดการตรงกับวันที่ใดวันหนึ่ง (.occurs_on?) หรือเกิดขึ้นที่เวลาใด (.occurrences, .first, .all_occurrences)
ลองจินตนาการว่าคุณต้องการ:
ทุกวันศุกร์ที่ 13 ของเดือนตุลาคม
คุณจะเขียน:
schedule = IceCube::Schedule.newschedule.add_recurrence_rule( IceCube::Rule.yearly.day_of_month(13).day(:วันศุกร์).month_of_year(:ตุลาคม))
การนำเสนอจาก Lone Star Ruby Conf (สไลด์, YouTube)
บทนำด่วน
เว็บไซต์เอกสาร
ด้วย ice_cube คุณสามารถระบุ (ตามลำดับที่เพิ่มขึ้น):
กฎการเกิดซ้ำ - กฎเกี่ยวกับวิธีการรวมเวลาที่เกิดซ้ำในกำหนดการ
ครั้งที่เกิดซ้ำ - เพื่อรวมไว้ในกำหนดการโดยเฉพาะ
เวลายกเว้น - เพื่อแยกออกจากกำหนดการโดยเฉพาะ
ตัวอย่าง: การระบุการเกิดซ้ำโดยมีเวลายกเว้น ต้องใช้ "rails/activesupport" ( gem install 'activesupport'
)
ต้องการ 'ice_cube'require 'active_support/time'schedule = IceCube::Schedule.new (ตอนนี้ = Time.now) ทำ | s | s.add_recurrence_rule(ไอซ์คิวบ์::Rule.daily.count(4)) s.add_Exception_time(now + 1.day)end# รายการที่เกิดขึ้นจนถึง end_time (end_time จำเป็นสำหรับกฎที่ไม่สิ้นสุด)occurrences = schedule.occurrences(end_time) # [now]# หรือเหตุการณ์ทั้งหมด (เฉพาะสำหรับการยกเลิกกำหนดการ) การเกิดขึ้น = schedule.all_occurrences # [ตอนนี้ ตอนนี้ + 2.วัน ตอนนี้ + 3.วัน]# หรือตรวจสอบเพียงรายการเดียว timeschedule.occurs_at?(ตอนนี้ + 1.วัน) # falseschedule.occurs_at?(ตอนนี้ + 2.วัน) # true# หรือตรวจสอบเพียงวันเดียว schedule.occurs_on?(Date.today) # true# หรือตรวจสอบว่าเกิดขึ้นระหว่างสองวัน Datesschedule.occurs_between?(ตอนนี้ ตอนนี้ + 30.วัน) # trueschedule.occurs_between?(ตอนนี้ + 30.วัน) 4.วัน ตอนนี้ + 30.วัน) # false# หรือครั้งแรก (n) allowancesschedule.first(2) # [ตอนนี้ ตอนนี้ + 2.วัน]schedule.first # ตอนนี้# หรือครั้งล่าสุด (n) ที่เกิดขึ้น (ถ้า กำหนดการสิ้นสุด)schedule.last(2) # [ตอนนี้ + 2.วัน ตอนนี้ + 3.วัน]schedule.last # ตอนนี้ + 3.วัน# หรือถัดไป allowanceschedule.next_occurrence(from_time) # ค่าเริ่มต้นเป็น Time.nowschedule.next_occurrences(4, from_time) # ค่าเริ่มต้นเป็น Time.nowschedule.remaining_occurrences # สำหรับการยกเลิกกำหนดการ# หรือเหตุการณ์ที่เกิดขึ้นก่อนหน้านี้chedule.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)# หรือกำหนดระยะเวลาให้กับกำหนดการและถามว่า allowanceing_at?schedule = IceCube::Schedule.new(now, ระยะเวลา: 3600)schedule.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(now + 1800) # trueschedule.occurring_between?(t1, t2)# การใช้ end_time ยังกำหนดระยะเวลา scheduleschedule = 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)schedule.each_occurrence { |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 หรือสตริงของแต่ละกฎ หรือกำหนดการทั้งหมด
กฎ = 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'
มีกฎการเกิดซ้ำหลายประเภทที่สามารถเพิ่มลงในกำหนดการได้:
# ทุกวันchedule.add_recurrence_rule IceCube::Rule.daily# ทุกสามวันchedule.add_recurrence_rule IceCube::Rule.daily(3)
# ทุกสัปดาห์chedule.add_recurrence_rule IceCube::Rule.weekly# ทุกสัปดาห์เว้นสัปดาห์ในวันจันทร์และอังคารchedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:monday, :tuesday)# เพื่อความสะดวกของโปรแกรม (เช่นเดียวกับข้างต้น) add_recurrence_rule IceCube::Rule.weekly(2).วัน(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(วันอังคาร: [1, -1])# ทุกเดือนเว้นในวันจันทร์แรกและวันอังคารสุดท้ายchedule.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)# ทุกปีที่สี่ในวันปีใหม่ eveschedule.add_recurrence_rule IceCube::Rule.yearly(4) .day_of_year(-1)
# ทุกปีในวันเดียวกับ start_time แต่ในเดือนมกราคมและกุมภาพันธ์schedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# ทุกสามปีใน Marchschedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year (:march)# เพื่อความสะดวกทางโปรแกรม (เช่นเดียวกับ above)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.minutely(10)# ทุก ๆ ชั่วโมงครึ่ง ในวันอังคารสุดท้ายของเดือนchedule.add_recurrence_rule IceCube::Rule.minutely(90).day_of_week(วันอังคาร: [-1])
# ทุกวินาทีchedule.add_recurrence_rule IceCube::Rule.secondly# ทุก 15 วินาทีระหว่าง 12:00 - 12:59schedule.add_recurrence_rule IceCube::Rule.secondly(15).hour_of_day(12)
ทีมงานที่ GetJobber มี RecurringSelect แบบโอเพ่นซอร์ส ซึ่งทำให้การทำงานกับ IceCube ง่ายขึ้นในแอป Rails ผ่านทางตัวช่วยที่ดี
ตรวจสอบได้ที่https://github.com/GetJobber/recurring_select
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
ใช้ตัวติดตามปัญหา GitHub
ยินดีให้การสนับสนุน - ฉันใช้ GitHub สำหรับการติดตามปัญหา (การทดสอบที่ล้มเหลวที่มาพร้อมกับนั้นยอดเยี่ยมมาก) และคำขอคุณสมบัติ
ส่งคำขอทางแยกและดึง (รวมการทดสอบ)
หากคุณกำลังทำงานที่สำคัญ โปรดส่งข้อความถึงฉันล่วงหน้า