permata instal ice_cube
ice_cube adalah perpustakaan Ruby untuk dengan mudah menangani acara berulang (jadwal). API ini dimodelkan setelah peristiwa iCalendar, dalam sintaksis Ruby yang menyenangkan. Kekuatannya terletak pada kemampuan untuk menentukan beberapa aturan, dan membuat ice_cube dengan cepat mengetahui apakah jadwal tersebut jatuh pada tanggal tertentu (.occurs_on?), atau jam berapa jadwal tersebut terjadi (.occurrences, .first, .all_occurrences).
Bayangkan Anda ingin:
Setiap hari Jumat tanggal 13 yang jatuh pada bulan Oktober
Anda akan menulis:
jadwal = IceCube::Jadwal.jadwal berita.add_recurrence_rule( IceCube::Rule.yearly.day_of_month(13).day(:friday).month_of_year(:october))
Presentasi dari Lone Star Ruby Conf (slide, YouTube)
Pengenalan Singkat
Situs Dokumentasi
Dengan ice_cube, Anda dapat menentukan (dalam urutan prioritas yang semakin meningkat):
Aturan Pengulangan - Aturan tentang cara memasukkan waktu berulang dalam jadwal
Waktu Pengulangan - Untuk dimasukkan secara spesifik ke dalam jadwal
Waktu Pengecualian - Untuk mengecualikan secara khusus dari jadwal
Contoh: Menentukan perulangan dengan waktu pengecualian. Membutuhkan "rails/activesupport" ( gem install 'activesupport'
).
memerlukan 'ice_cube'require 'active_support/time'schedule = IceCube::Schedule.new(now = Time.now) lakukan |s| s.add_recurrence_rule(IceCube::Rule.daily.count(4)) s.tambahkan_pengecualian_waktu(sekarang + 1.hari)akhir# daftar kejadian hingga waktu_akhir (waktu_akhir diperlukan untuk aturan yang tidak berakhir)occurrences = jadwal.kejadian(waktu_akhir) # [sekarang]# atau semua kejadian (hanya untuk jadwal yang berakhir) kejadian = jadwal.semua_kejadian # [sekarang, sekarang + 2.hari, sekarang + 3.hari]# atau centang satu saja timeschedule.occurs_at?(now + 1.day) # falseschedule.occurs_at?(now + 2.days) # true# atau periksa hanya satu harichedule.occurs_on?(Date.today) # true# atau periksa apakah terjadi di antara dua dateschedule.occurs_between?(sekarang, sekarang + 30.hari) # trueschedule.occurs_between?(sekarang + 4.hari, sekarang + 30.hari) # false# atau (n) kejadian pertamaschedule.first(2) # [sekarang, sekarang + 2.hari]schedule.first # sekarang# atau (n) kejadian terakhir (jika jadwal berakhir)schedule.last(2) # [sekarang + 2.hari, sekarang + 3.hari]schedule.last # sekarang + 3.hari# atau berikutnya kejadianjadwal.next_occurrence(from_time) # default ke Time.nowschedule.next_occurrences(4, from_time) # default ke Time.nowschedule.remaining_occurrences # untuk mengakhiri jadwal# atau kejadian sebelumnyaschedule.previous_occurrence(from_time)schedule.previous_occurrences(4, from_time)# atau sertakan kejadian sebelumnya dengan a durasi tumpang tindih from_timeschedule.next_occurrences(4, from_time, spans: true)schedule.occurrences_between(from_time, to_time, spans: true)# atau berikan jadwal durasi dan tanyakan apakah terjadi_at?schedule = IceCube::Schedule.new(now, durasi : 3600)jadwal.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(sekarang + 1800) # trueschedule.occurring_between?(t1, t2)# menggunakan end_time juga menyetel durasischedule = IceCube::Schedule.new(start = Time.now, end_time: start + 3600 )jadwal.add_recurrence_rule IceCube::Rule.dailyschedule.occurring_at?(mulai + 3599) # trueschedule.occurring_at?(mulai + 3600) # false# kendalikan dan gunakan iterationschedule = IceCube::Schedule.newschedule.add_recurrence_rule IceCube::Rule.daily.until( Tanggal.hari ini + 30)jadwal.setiap_kejadian { |t| menempatkan t }
Alasan jadwal memiliki jangka waktu dan bukan aturan individual, adalah untuk menjaga kompatibilitas dengan RFC ical: http://www.kanzaki.com/docs/ical/rrule.html
Untuk membatasi jadwal gunakan count
atau until
pada aturan pengulangan. Menyetel end_time
pada jadwal hanya menyetel durasi (dari waktu mulai) untuk setiap kejadian.
ice_cube berfungsi dengan baik tanpa ActiveSupport tetapi hanya mendukung satu zona waktu "lokal" lingkungan ( ENV['TZ']
) atau UTC. Untuk mendukung beberapa zona waktu dengan benar (terutama untuk DST), Anda harus memerlukan 'dukungan_aktif/waktu'.
Kemunculan jadwal akan dikembalikan dalam kelas dan zona waktu yang sama dengan waktu_mulai jadwal. Jadwal waktu mulai didukung sebagai:
Time.local (default ketika tidak ada waktu yang ditentukan)
Waktu.utc
ActiveSupport::TimeWithZone (dengan Time.zone.now
, Time.zone.local
, time.in_time_zone(tz)
)
DateTime (tidak digunakan lagi) dan Tanggal diubah menjadi Time.local
ice_cube mengimplementasikan .to_yaml berbasis hashnya sendiri, sehingga Anda dapat dengan cepat (dan aman) membuat serialisasi objek jadwal masuk dan keluar dari penyimpanan data Anda
Ini juga mendukung serialisasi parsial ke/dari ICAL
. Mengurai waktu dengan informasi zona waktu saat ini tidak didukung.
yaml = jadwal.to_yamlIceCube::Jadwal.dari_yaml(yaml)hash = jadwal.to_hashIceCube::Jadwal.dari_hash(hash)ical = jadwal.to_icalIceCube::Jadwal.dari_ical(ical)
ice_cube dapat memberikan representasi ical atau string dari aturan individual, atau keseluruhan jadwal.
rule = IceCube::Rule.daily(2).day_of_week(selasa: [1, -1], rabu: [2])rule.to_ical # 'FREQ=DAILY;INTERVAL=2;BYDAY=1TU,-1TU,2WE 'rule.to_s # 'Setiap 2 hari pada hari Selasa terakhir dan pertama dan Rabu kedua'
Ada banyak jenis aturan perulangan yang dapat ditambahkan ke jadwal:
# setiap harichedule.add_recurrence_rule IceCube::Rule.daily# setiap hari ketigachedule.add_recurrence_rule IceCube::Rule.daily(3)
# setiap mingguchedule.add_recurrence_rule IceCube::Rule.weekly# setiap dua minggu sekali pada hari Senin dan selasaschedule.add_recurrence_rule IceCube::Rule.weekly(2).day(:monday, :tuesday)# untuk jadwal kenyamanan terprogram (sama seperti di atas). tambahkan_recurrence_rule IceCube::Rule.weekly(2).day(1, 2)# menentukan interval mingguan dengan hari kerja pertama yang berbeda (defaultnya adalah Minggu)schedule.add_recurrence_rule IceCube::Rule.weekly(1, :monday)
# setiap bulan pada hari pertama dan terakhir dari jadwal bulan.add_recurrence_rule IceCube::Rule.monthly.day_of_month(1, -1)# setiap dua bulan sekali pada tanggal 15 bulanchedule.add_recurrence_rule IceCube::Rule.monthly(2). hari_bulan_(15)
Aturan bulanan akan melewatkan bulan yang terlalu pendek untuk hari yang ditentukan (misalnya tidak ada kejadian di bulan Februari untuk day_of_month(31)
).
# setiap bulan pada hari Selasa pertama dan terakhir dari jadwal bulan.add_recurrence_rule IceCube::Rule.monthly.day_of_week(Selasa: [1, -1])# setiap dua bulan pada hari Senin pertama dan jadwal selasa terakhir.add_recurrence_rule IceCube::Rule. bulanan(2).hari_minggu( Senin: [1], selasa: [-1])# untuk kenyamanan terprogram (sama seperti di atas)schedule.add_recurrence_rule IceCube::Rule.monthly(2).day_of_week(1 => [1], 2 => [-1])
# setiap tahun pada hari ke-100 dari awal dan akhir jadwal tahun.add_recurrence_rule IceCube::Rule.yearly.day_of_year(100, -100)# setiap tahun keempat pada eveschedule tahun baru.add_recurrence_rule IceCube::Rule.yearly(4) .hari_tahun_(-1)
# setiap tahun pada hari yang sama dengan waktu_mulai tetapi pada bulan Januari dan februaryschedule.add_recurrence_rule IceCube::Rule.yearly.month_of_year(:january, :february)# setiap tahun ketiga dalam marchschedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year (:march)# untuk kenyamanan terprogram (sama seperti di atas)schedule.add_recurrence_rule IceCube::Rule.yearly(3).month_of_year(3)
# setiap jam pada menit dan detik yang sama dengan jadwal tanggal mulai.add_recurrence_rule IceCube::Rule.hourly# setiap jam lainnya, pada mondaysschedule.add_recurrence_rule IceCube::Rule.hourly(2).day(:monday)
# setiap 10 menitschedule.add_recurrence_rule IceCube::Rule.minitly(10)# setiap satu setengah jam, pada hari Selasa terakhir di bulanchedule.add_recurrence_rule IceCube::Rule.minitly(90).day_of_week(selasa: [-1])
# setiap detikjadwal.add_recurrence_rule IceCube::Rule.secondly# setiap 15 detik antara pukul 12:00 - 12:59schedule.add_recurrence_rule IceCube::Rule.secondly(15).hour_of_day(12)
Tim di GetJobber memiliki RecurringSelect bersumber terbuka, yang membuat bekerja dengan IceCube lebih mudah di aplikasi Rails melalui beberapa pembantu yang bagus.
Lihat di https://github.com/GetJobber/recurring_select
https://github.com/ice-cube-ruby/ice_cube/graphs/contributors
Gunakan pelacak masalah GitHub
Kontribusi dipersilakan - Saya menggunakan GitHub untuk pelacakan masalah (pengujian yang gagal sangat membantu) dan permintaan fitur
Kirim melalui permintaan fork dan pull (termasuk tes)
Jika Anda sedang mengerjakan sesuatu yang besar, kirimkan pesan kepada saya terlebih dahulu