# README
rrule-go
Go library for working with recurrence rules for calendar dates.
The rrule module offers a complete implementation of the recurrence rules documented in the iCalendar RFC. It is a partial port of the rrule module from the excellent python-dateutil library.
Demo
rrule.RRule
package main
import (
"fmt"
"time"
"github.com/teambition/rrule-go"
)
func printTimeSlice(ts []time.Time) {
for _, t := range ts {
fmt.Println(t)
}
}
func main() {
// Daily, for 10 occurrences.
r, _ := rrule.NewRRule(rrule.ROption{
Freq: rrule.DAILY,
Count: 10,
Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC),
})
fmt.Println(r.String())
// DTSTART:19970902T090000Z
// RRULE:FREQ=DAILY;COUNT=10
printTimeSlice(r.All())
// 1997-09-02 09:00:00 +0000 UTC
// 1997-09-03 09:00:00 +0000 UTC
// ...
// 1997-09-07 09:00:00 +0000 UTC
printTimeSlice(r.Between(
time.Date(1997, 9, 6, 0, 0, 0, 0, time.UTC),
time.Date(1997, 9, 8, 0, 0, 0, 0, time.UTC), true))
// [1997-09-06 09:00:00 +0000 UTC
// 1997-09-07 09:00:00 +0000 UTC]
// Every four years, the first Tuesday after a Monday in November, 3 occurrences (U.S. Presidential Election day).
r, _ = rrule.NewRRule(rrule.ROption{
Freq: rrule.YEARLY,
Interval: 4,
Count: 3,
Bymonth: []int{11},
Byweekday: []rrule.Weekday{rrule.TU},
Bymonthday: []int{2, 3, 4, 5, 6, 7, 8},
Dtstart: time.Date(1996, 11, 5, 9, 0, 0, 0, time.UTC),
})
fmt.Println(r.String())
// DTSTART:19961105T090000Z
// RRULE:FREQ=YEARLY;INTERVAL=4;COUNT=3;BYMONTH=11;BYMONTHDAY=2,3,4,5,6,7,8;BYDAY=TU
printTimeSlice(r.All())
// 1996-11-05 09:00:00 +0000 UTC
// 2000-11-07 09:00:00 +0000 UTC
// 2004-11-02 09:00:00 +0000 UTC
}
rrule.Set
func ExampleSet() {
// Daily, for 7 days, jumping Saturday and Sunday occurrences.
set := rrule.Set{}
r, _ := rrule.NewRRule(rrule.ROption{
Freq: rrule.DAILY,
Count: 7,
Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC)})
set.RRule(r)
fmt.Println(set.String())
// DTSTART:19970902T090000Z
// RRULE:FREQ=DAILY;COUNT=7
printTimeSlice(set.All())
// 1997-09-02 09:00:00 +0000 UTC
// 1997-09-03 09:00:00 +0000 UTC
// 1997-09-04 09:00:00 +0000 UTC
// 1997-09-05 09:00:00 +0000 UTC
// 1997-09-06 09:00:00 +0000 UTC
// 1997-09-07 09:00:00 +0000 UTC
// 1997-09-08 09:00:00 +0000 UTC
// Weekly, for 4 weeks, plus one time on day 7, and not on day 16.
set = rrule.Set{}
r, _ = rrule.NewRRule(rrule.ROption{
Freq: rrule.WEEKLY,
Count: 4,
Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC)})
set.RRule(r)
set.RDate(time.Date(1997, 9, 7, 9, 0, 0, 0, time.UTC))
set.ExDate(time.Date(1997, 9, 16, 9, 0, 0, 0, time.UTC))
fmt.Println(set.String())
// DTSTART:19970902T090000Z
// RRULE:FREQ=WEEKLY;COUNT=4
// RDATE:19970907T090000Z
// EXDATE:19970916T090000Z
printTimeSlice(set.All())
// 1997-09-02 09:00:00 +0000 UTC
// 1997-09-07 09:00:00 +0000 UTC
// 1997-09-09 09:00:00 +0000 UTC
// 1997-09-23 09:00:00 +0000 UTC
}
rrule.StrToRRule
func ExampleStrToRRule() {
// Compatible with old DTSTART
r, _ := rrule.StrToRRule("FREQ=DAILY;DTSTART=20060101T150405Z;COUNT=5")
fmt.Println(r.OrigOptions.RRuleString())
// FREQ=DAILY;COUNT=5
fmt.Println(r.OrigOptions.String())
// DTSTART:20060101T150405Z
// RRULE:FREQ=DAILY;COUNT=5
fmt.Println(r.String())
// DTSTART:20060101T150405Z
// RRULE:FREQ=DAILY;COUNT=5
printTimeSlice(r.All())
// 2006-01-01 15:04:05 +0000 UTC
// 2006-01-02 15:04:05 +0000 UTC
// 2006-01-03 15:04:05 +0000 UTC
// 2006-01-04 15:04:05 +0000 UTC
// 2006-01-05 15:04:05 +0000 UTC
}
rrule.StrToRRuleSet
func ExampleStrToRRuleSet() {
s, _ := rrule.StrToRRuleSet("DTSTART:20060101T150405Z\nRRULE:FREQ=DAILY;COUNT=5\nEXDATE:20060102T150405Z")
fmt.Println(s.String())
// DTSTART:20060101T150405Z
// RRULE:FREQ=DAILY;COUNT=5
// EXDATE:20060102T150405Z
printTimeSlice(s.All())
// 2006-01-01 15:04:05 +0000 UTC
// 2006-01-03 15:04:05 +0000 UTC
// 2006-01-04 15:04:05 +0000 UTC
// 2006-01-05 15:04:05 +0000 UTC
}
For more examples see python-dateutil documentation.
License
Gear is licensed under the MIT license. Copyright © 2017-2023 Teambition.
# Functions
NewRRule construct a new RRule instance.
StrSliceToRRuleSet converts given str slice to RRuleSet In case there is a time met in any rule without specified time zone, when it is parsed in UTC (see StrSliceToRRuleSetInLoc).
StrSliceToRRuleSetInLoc is same as StrSliceToRRuleSet, but by default parses local times in specified default location.
StrToDates is intended to parse RDATE and EXDATE properties supporting only VALUE=DATE-TIME (DATE and PERIOD are not supported).
StrToDatesInLoc same as StrToDates but it consideres default location to parse dates in in case no location specified with TZID parameter.
StrToDtStart accepts string with format: "(TZID={timezone}:)?{time}" and parses it to a date may be used to parse DTSTART rules, without the DTSTART; part.
StrToROption converts string to ROption.
StrToROptionInLocation is same as StrToROption but in case local time is supplied as date-time/date field (ex.
StrToRRule converts string to RRule.
StrToRRuleSet converts string to RRuleSet.
# Constants
Constants.
DateFormat is date format used in iCalendar (RFC 5545).
DateTimeFormat is date-time format used in iCalendar (RFC 5545).
Constants.
LocalDateTimeFormat is a date-time format without Z prefix.
MAXYEAR.
Constants.
Constants.
Constants.
Constants.
Constants.
# Variables
Weekdays.
Every mask is 7 days longer to handle cross-year weekly periods.
Every mask is 7 days longer to handle cross-year weekly periods.
Every mask is 7 days longer to handle cross-year weekly periods.
Every mask is 7 days longer to handle cross-year weekly periods.
Every mask is 7 days longer to handle cross-year weekly periods.
Every mask is 7 days longer to handle cross-year weekly periods.
Weekdays.
Every mask is 7 days longer to handle cross-year weekly periods.
Every mask is 7 days longer to handle cross-year weekly periods.
Weekdays.
Weekdays.
Weekdays.
Weekdays.
Every mask is 7 days longer to handle cross-year weekly periods.
Weekdays.
# Structs
ROption offers options to construct a RRule instance.
RRule offers a small, complete, and very fast, implementation of the recurrence rules documented in the iCalendar RFC, including support for caching of results.
Set allows more complex recurrence setups, mixing multiple rules, dates, exclusion rules, and exclusion dates.
Weekday specifying the nth weekday.