Adds event recurrence to the icalendar gem. This is helpful in cases where you'd like to parse an ICS and generate a series of event occurrences.
Note: Works with 2.0.0beta.1 (or newer) icalendar gem. If you're using icalendar <=1.5.4, take a look at the new code before you switch over.
gem "icalendar-recurrence"
and run bundle install
from your shell.
require 'date' # for parse method
require 'icalendar/recurrence'
calendars = Icalendar::Calendar.parse(File.read(path_to_ics)) # parse an ICS file
event = Array(calendars).first.events.first # retrieve the first event
event.occurrences_between(Date.parse("2014-01-01"), Date.parse("2014-02-01")) # get all occurrence for one month
To get all occurrences you can use all_occurrences
. This only works when you have specified an ending using until
or count
in your RRULE.
An event occurrence is a simple struct object with start_time
and end_time
methods.
occurrence.start_time # => 2014-02-01 00:00:00 -0800
occurrence.end_time # => 2014-02-02 00:00:00 -0800
require 'date' # for parse method
require 'icalendar/recurrence'
ics_string = <<-EOF
BEGIN:VCALENDAR
X-WR-CALNAME:Test Public
X-WR-CALID:f512e378-050c-4366-809a-ef471ce45b09:101165
PRODID:Zimbra-Calendar-Provider
VERSION:2.0
METHOD:PUBLISH
BEGIN:VEVENT
UID:efcb99ae-d540-419c-91fa-42cc2bd9d302
RRULE:FREQ=DAILY;INTERVAL=1
SUMMARY:Every day, except the 28th
DTSTART;VALUE=DATE:20140101
DTEND;VALUE=DATE:20140102
STATUS:CONFIRMED
CLASS:PUBLIC
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
TRANSP:TRANSPARENT
LAST-MODIFIED:20140113T200625Z
DTSTAMP:20140113T200625Z
SEQUENCE:0
EXDATE;VALUE=DATE:20140128
END:VEVENT
END:VCALENDAR
EOF
# An event that occurs every day, starting January 1, 2014 with one excluded
# date. January 28, 2014 will not appear in the occurrences.
calendars = Icalendar::Calendar.parse(ics_string)
every_day_except_jan_28 = Array(calendars).first.events.first
puts "Every day except January 28, 2014, occurrences from 2014-01-01 to 2014-02-01:"
puts every_day_except_jan_28.occurrences_between(Date.parse("2014-01-01"), Date.parse("2014-02-01"))
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)