rrule

package module
v1.7.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 20, 2021 License: MIT Imports: 7 Imported by: 81

README

rrule-go

Go library for working with recurrence rules for calendar dates.

Build Status Coverage Status License GoDoc

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 exampleRRule() {
	fmt.Println("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.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-11 09:00:00 +0000 UTC]

	fmt.Println(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]

	fmt.Println(r)
	// DTSTART:19970902T090000Z
	// FREQ=DAILY;COUNT=10

	fmt.Println("\nEvery 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.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 exampleRRuleSet() {
	fmt.Println("\nDaily, 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.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]

	fmt.Println("\nWeekly, 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.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() {
	fmt.Println()
	r, _ := rrule.StrToRRule("FREQ=DAILY;INTERVAL=10;COUNT=5")
	fmt.Println(r.All())
	// [2020-10-12 02:26:35 +0000 UTC
	//  2020-10-22 02:26:35 +0000 UTC
	//  2020-11-01 02:26:35 +0000 UTC
	//  2020-11-11 02:26:35 +0000 UTC
	//  2020-11-21 02:26:35 +0000 UTC]
}
rrule.StrToRRuleSet
func exampleStrToRRuleSet() {
	s, _ := rrule.StrToRRuleSet(`RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
RDATE:20060102T150405Z`)
	fmt.Println(s.All())
	// [2006-01-02 15:04:05 +0000 UTC
	//  2020-10-12 02:26:35 +0000 UTC
	//  2020-10-22 02:26:35 +0000 UTC
	//  2020-11-01 02:26:35 +0000 UTC
	//  2020-11-11 02:26:35 +0000 UTC
	//  2020-11-21 02:26:35 +0000 UTC]
}

For more examples see python-dateutil documentation.

License

Gear is licensed under the MIT license. Copyright © 2017-2020 Teambition.

Documentation

Index

Constants

View Source
const (
	// DateTimeFormat is date-time format used in iCalendar (RFC 5545)
	DateTimeFormat = "20060102T150405Z"
	// LocalDateTimeFormat is a date-time format without Z prefix
	LocalDateTimeFormat = "20060102T150405"
	// DateFormat is date format used in iCalendar (RFC 5545)
	DateFormat = "20060102"
)
View Source
const (
	MAXYEAR = 9999
)

MAXYEAR

Variables

View Source
var (
	M366MASK     []int
	M365MASK     []int
	MDAY366MASK  []int
	MDAY365MASK  []int
	NMDAY366MASK []int
	NMDAY365MASK []int
	WDAYMASK     []int
	M366RANGE    = []int{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}
	M365RANGE    = []int{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}
)

Every mask is 7 days longer to handle cross-year weekly periods.

View Source
var (
	MO = Weekday{/* contains filtered or unexported fields */}
	TU = Weekday{/* contains filtered or unexported fields */}
	WE = Weekday{/* contains filtered or unexported fields */}
	TH = Weekday{/* contains filtered or unexported fields */}
	FR = Weekday{/* contains filtered or unexported fields */}
	SA = Weekday{/* contains filtered or unexported fields */}
	SU = Weekday{/* contains filtered or unexported fields */}
)

Weekdays

Functions

func StrToDates

func StrToDates(str string) (ts []time.Time, err error)

StrToDates is intended to parse RDATE and EXDATE properties supporting only VALUE=DATE-TIME (DATE and PERIOD are not supported). Accepts string with format: "VALUE=DATE-TIME;[TZID=...]:{time},{time},...,{time}" or simply "{time},{time},...{time}" and parses it to array of dates In case no time zone specified in str, when all dates are parsed in UTC

func StrToDatesInLoc added in v1.2.2

func StrToDatesInLoc(str string, defaultLoc *time.Location) (ts []time.Time, err error)

StrToDatesInLoc same as StrToDates but it consideres default location to parse dates in in case no location specified with TZID parameter

func StrToDtStart added in v1.7.2

func StrToDtStart(str string, defaultLoc *time.Location) (time.Time, error)

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.

Types

type Frequency

type Frequency int

Frequency denotes the period on which the rule is evaluated.

const (
	YEARLY Frequency = iota
	MONTHLY
	WEEKLY
	DAILY
	HOURLY
	MINUTELY
	SECONDLY
)

Constants

func StrToFreq added in v1.7.1

func StrToFreq(str string) (Frequency, error)

func (Frequency) String

func (f Frequency) String() string

type Next

type Next func() (value time.Time, ok bool)

Next is a generator of time.Time. It returns false of Ok if there is no value to generate.

type ROption

type ROption struct {
	Freq       Frequency
	Dtstart    time.Time
	Interval   int
	Wkst       Weekday
	Count      int
	Until      time.Time
	Bysetpos   []int
	Bymonth    []int
	Bymonthday []int
	Byyearday  []int
	Byweekno   []int
	Byweekday  []Weekday
	Byhour     []int
	Byminute   []int
	Bysecond   []int
	Byeaster   []int
}

ROption offers options to construct a RRule instance

func StrToROption

func StrToROption(rfcString string) (*ROption, error)

StrToROption converts string to ROption.

func StrToROptionInLocation added in v1.0.1

func StrToROptionInLocation(rfcString string, loc *time.Location) (*ROption, error)

StrToROptionInLocation is same as StrToROption but in case local time is supplied as date-time/date field (ex. UNTIL), it is parsed as a time in a given location (time zone)

func (*ROption) RRuleString added in v1.6.0

func (option *ROption) RRuleString() string

RRuleString returns RRULE string exclude DTSTART

func (*ROption) String

func (option *ROption) String() string

String returns RRULE string with DTSTART if exists. e.g.

DTSTART;TZID=America/New_York:19970105T083000
RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30

type RRule

type RRule struct {
	OrigOptions ROption
	Options     ROption
	// contains filtered or unexported fields
}

RRule offers a small, complete, and very fast, implementation of the recurrence rules documented in the iCalendar RFC, including support for caching of results.

func NewRRule

func NewRRule(arg ROption) (*RRule, error)

NewRRule construct a new RRule instance

func StrToRRule

func StrToRRule(rfcString string) (*RRule, error)

StrToRRule converts string to RRule

func (*RRule) After

func (r *RRule) After(dt time.Time, inc bool) time.Time

After returns the first recurrence after the given datetime instance, or time.Time's zero value if no recurrence match. The inc keyword defines what happens if dt is an occurrence. With inc == True, if dt itself is an occurrence, it will be returned.

func (*RRule) All

func (r *RRule) All() []time.Time

All returns all occurrences of the RRule.

func (*RRule) Before

func (r *RRule) Before(dt time.Time, inc bool) time.Time

Before returns the last recurrence before the given datetime instance, or time.Time's zero value if no recurrence match. The inc keyword defines what happens if dt is an occurrence. With inc == True, if dt itself is an occurrence, it will be returned.

func (*RRule) Between

func (r *RRule) Between(after, before time.Time, inc bool) []time.Time

Between returns all the occurrences of the RRule between after and before. The inc keyword defines what happens if after and/or before are themselves occurrences. With inc == True, they will be included in the list, if they are found in the recurrence set.

func (*RRule) DTStart added in v1.2.4

func (r *RRule) DTStart(dt time.Time)

DTStart set a new DTSTART for the rule and recalculates the timeset if needed.

func (*RRule) GetDTStart added in v1.7.0

func (r *RRule) GetDTStart() time.Time

GetDTStart gets DTSTART time for rrule

func (*RRule) GetUntil added in v1.7.0

func (r *RRule) GetUntil() time.Time

GetUntil gets UNTIL time for rrule

func (*RRule) Iterator

func (r *RRule) Iterator() Next

Iterator return an iterator for RRule

func (*RRule) String

func (r *RRule) String() string

func (*RRule) Until added in v1.3.0

func (r *RRule) Until(ut time.Time)

Until set a new UNTIL for the rule and recalculates the timeset if needed.

type Set

type Set struct {
	// contains filtered or unexported fields
}

Set allows more complex recurrence setups, mixing multiple rules, dates, exclusion rules, and exclusion dates

func StrSliceToRRuleSet

func StrSliceToRRuleSet(ss []string) (*Set, error)

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)

func StrSliceToRRuleSetInLoc added in v1.2.2

func StrSliceToRRuleSetInLoc(ss []string, defaultLoc *time.Location) (*Set, error)

StrSliceToRRuleSetInLoc is same as StrSliceToRRuleSet, but by default parses local times in specified default location

func StrToRRuleSet

func StrToRRuleSet(s string) (*Set, error)

StrToRRuleSet converts string to RRuleSet

func (*Set) After

func (set *Set) After(dt time.Time, inc bool) time.Time

After returns the first recurrence after the given datetime instance, or time.Time's zero value if no recurrence match. The inc keyword defines what happens if dt is an occurrence. With inc == True, if dt itself is an occurrence, it will be returned.

func (*Set) All

func (set *Set) All() []time.Time

All returns all occurrences of the rrule.Set.

func (*Set) Before

func (set *Set) Before(dt time.Time, inc bool) time.Time

Before Returns the last recurrence before the given datetime instance, or time.Time's zero value if no recurrence match. The inc keyword defines what happens if dt is an occurrence. With inc == True, if dt itself is an occurrence, it will be returned.

func (*Set) Between

func (set *Set) Between(after, before time.Time, inc bool) []time.Time

Between returns all the occurrences of the rrule between after and before. The inc keyword defines what happens if after and/or before are themselves occurrences. With inc == True, they will be included in the list, if they are found in the recurrence set.

func (*Set) DTStart added in v1.2.0

func (set *Set) DTStart(dtstart time.Time)

DTStart sets dtstart property for set

func (*Set) ExDate

func (set *Set) ExDate(exdate time.Time)

ExDate include the given datetime instance in the recurrence set exclusion list. Dates included that way will not be generated, even if some inclusive rrule or rdate matches them.

func (*Set) GetDTStart added in v1.2.0

func (set *Set) GetDTStart() time.Time

GetDTStart gets DTSTART for set

func (*Set) GetExDate

func (set *Set) GetExDate() []time.Time

GetExDate returns explicitly excluded dates (exdates) in the set

func (*Set) GetRDate

func (set *Set) GetRDate() []time.Time

GetRDate returns explicitly added dates (rdates) in the set

func (*Set) GetRRule

func (set *Set) GetRRule() *RRule

GetRRule returns the rrules in the set

func (*Set) Iterator

func (set *Set) Iterator() (next func() (time.Time, bool))

Iterator returns an iterator for rrule.Set

func (*Set) RDate

func (set *Set) RDate(rdate time.Time)

RDate include the given datetime instance in the recurrence set generation.

func (*Set) RRule

func (set *Set) RRule(rrule *RRule)

RRule set the RRULE for set. There is the only one RRULE in the set as https://tools.ietf.org/html/rfc5545#appendix-A.1

func (*Set) Recurrence

func (set *Set) Recurrence() []string

Recurrence returns a slice of all the recurrence rules for a set

func (*Set) SetExDates added in v1.5.0

func (set *Set) SetExDates(exdates []time.Time)

SetExDates sets explicitly excluded dates (exdates) in the set

func (*Set) SetRDates added in v1.5.0

func (set *Set) SetRDates(rdates []time.Time)

SetRDates sets explicitly added dates (rdates) in the set

func (*Set) String

func (set *Set) String() string

type Weekday

type Weekday struct {
	// contains filtered or unexported fields
}

Weekday specifying the nth weekday. Field N could be positive or negative (like MO(+2) or MO(-3). Not specifying N (0) is the same as specifying +1.

func (*Weekday) Day added in v1.1.0

func (wday *Weekday) Day() int

Day returns index of the day in a week (0 for MO, 6 for SU)

func (*Weekday) N added in v1.1.0

func (wday *Weekday) N() int

N returns index of the week, e.g. for 3MO, N() will return 3

func (*Weekday) Nth

func (wday *Weekday) Nth(n int) Weekday

Nth return the nth weekday __call__ - Cannot call the object directly, do it through e.g. TH.nth(-1) instead,

func (Weekday) String

func (wday Weekday) String() string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL