拉鲁尔¶
RRULE模块提供了对中记录的重复规则的小型、完整且非常快速的实现 iCalendar RFC ,包括对结果缓存的支持。
Classes¶
- class dateutil.rrule.rrule(freq, dtstart=None, interval=1, wkst=None, count=None, until=None, bysetpos=None, bymonth=None, bymonthday=None, byyearday=None, byeaster=None, byweekno=None, byweekday=None, byhour=None, byminute=None, bysecond=None, cache=False)[源代码]¶
这是rRule操作的基础。它接受RFC中定义的所有关键字作为其构造函数参数(Byday除外,它被重命名为by Weekday)等等。构造函数原型为::
rrule(freq)
其中,freq必须是年、月、周、日、小时、分钟或秒之一。
备注
根据RFC第3.3.10节,重复实例落在无效日期和时间时将被忽略,而不是强制:
重复规则可以生成具有无效日期(例如,2月30日)或不存在本地时间(例如,本地时间在凌晨1:00提前一小时的某一天的凌晨1:30)的重复实例。必须忽略此类重复实例,并且不能将其计入重复集合的一部分。
例如,当开始日期出现在月底时,这可能会导致令人惊讶的行为:
>>> from dateutil.rrule import rrule, MONTHLY >>> from datetime import datetime >>> start_date = datetime(2014, 12, 31) >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) ... [datetime.datetime(2014, 12, 31, 0, 0), datetime.datetime(2015, 1, 31, 0, 0), datetime.datetime(2015, 3, 31, 0, 0), datetime.datetime(2015, 5, 31, 0, 0)]
此外,它还支持以下关键字参数:
- 参数:
dtstart -- 循环开始。除了作为循环的基础外,还将从此日期提取最终循环实例中缺少的参数。如果未指定,将使用datetime.now()。
interval -- 每次频率迭代之间的间隔。例如,使用年时,间隔为2表示每两年一次,但使用小时时,表示每两小时一次。默认间隔为1。
wkst -- 一周的开始日。必须是MO、TU、WE常量之一,或者是指定一周的第一天的整数。这将影响基于每周期间的重复性。默认的周开始时间是从calendar.firstWeekday()获取的,并且可以由calendar.setfirstWeekday()修改。
count --
如果给定,这将确定将生成多少个匹配项。
备注
As of version 2.5.0, the use of the keyword
until
in conjunction withcount
is deprecated, to make suredateutil
is fully compliant with RFC-5545 Sec. 3.3.10. Therefore,until
andcount
must not occur in the same call torrule
.until --
如果给定,这必须是指定重复上限的DateTime实例。规则中的最后一次重复是小于或等于中指定的值的最大日期时间
until
参数。备注
As of version 2.5.0, the use of the keyword
until
in conjunction withcount
is deprecated, to make suredateutil
is fully compliant with RFC-5545 Sec. 3.3.10. Therefore,until
andcount
must not occur in the same call torrule
.bysetpos -- 如果给定,它必须是一个整数,或者是一个正或负整数序列。每个给定的整数将指定一个出现次数,对应于规则在频率周期内的第n次出现。例如,bysetpos为-1,如果与每月频率相结合,则bysetpos为(MO,TU,WE,TH,FR),这将导致每个月的最后一个工作日。
bymonth -- 如果给定,它必须是整数或整数序列,这意味着要对其应用递归的月份。
bymonthday -- 如果给定,它必须是整数或整数序列,这意味着要对其应用递归的月份天数。
byyearday -- 如果给定,它必须是整数或整数序列,这意味着要对其应用递归的年份天数。
byeaster -- 如果给定,它必须是一个整数,或者是一个正或负整数序列。每个整数将定义与复活节星期日的偏移量。将偏移量0传递给byeaster将生成复活节星期天本身。这是RFC规范的扩展。
byweekno -- 如果给定,它必须是整数或整数序列,这意味着要对其应用递归的周数。周数字具有ISO8601中描述的含义,即一年的第一周至少包含新年的四天。
byweekday -- 如果给定,它必须是整数(0==MO)、整数序列、工作日常量之一(MO、TU等)或这些常量的序列。给定时,这些变量将定义将应用循环的工作日。也可以将参数n用于工作日实例,这将意味着该周期中该工作日的第n次出现。例如,对于Monthly或Year和BYMONTH,在按工作日使用FR(+1)将指定发生重复的月份的第一个星期五。请注意,在RFC文档中,它被指定为byday,但为了避免该关键字的歧义,将其重命名。
byhour -- 如果给定,则它必须是整数或整数序列,这意味着要对其应用递归的小时数。
byminute -- 如果给定,它必须是整数或整数序列,这意味着要对其应用递归的分钟数。
bysecond -- 如果给定,它必须是整数或整数序列,这意味着要对其应用递归的秒数。
cache -- 如果给定,它必须是指定启用或禁用结果缓存的布尔值。如果您要多次使用同一rRule实例,则启用缓存将显著提高性能。
- after(dt, inc=False)¶
返回给定DateTime实例之后的第一个递归。关键字INC定义如果DT是一个事件,将会发生什么情况。如果Inc=True,则如果DT本身是一个匹配项,则将返回它。
- before(dt, inc=False)¶
返回给定DateTime实例之前的最后一个递归。关键字INC定义如果DT是一个事件,将会发生什么情况。如果Inc=True,则如果DT本身是一个匹配项,则将返回它。
- between(after, before, inc=False, count=1)¶
返回在之后和之前之间出现的所有rRule。INC关键字定义如果发生在之后和/或之前本身时会发生什么。如果INC=True,则如果在循环集中找到它们,则它们将包括在列表中。
- count()¶
返回此集合中的递归次数。如果以前没有这样做过,它会经历整个循环。
- xafter(dt, count=None, inc=False)¶
发电机的产量最高可达 count 在给定DateTime实例之后的递归,等效于 after 。
- 参数:
dt -- 开始生成递归的日期时间。
count -- 要生成的最大递归次数。如果 None (默认),将生成日期,直到循环规则用完为止。
inc -- 如果 dt 是规则的实例,并且 inc 是 True ,则它包含在输出中。
- 收益率:
产生一系列 datetime 对象。
- class dateutil.rrule.rruleset(cache=False)[源代码]¶
rruleset类型允许更复杂的重复设置,可以混合多个规则、日期、排除规则和排除日期。类型构造函数采用以下关键字参数:
- 参数:
cache -- 如果为True,则将启用结果缓存,从而显著提高多个查询的性能。
- after(dt, inc=False)¶
返回给定DateTime实例之后的第一个递归。关键字INC定义如果DT是一个事件,将会发生什么情况。如果Inc=True,则如果DT本身是一个匹配项,则将返回它。
- before(dt, inc=False)¶
返回给定DateTime实例之前的最后一个递归。关键字INC定义如果DT是一个事件,将会发生什么情况。如果Inc=True,则如果DT本身是一个匹配项,则将返回它。
- between(after, before, inc=False, count=1)¶
返回在之后和之前之间出现的所有rRule。INC关键字定义如果发生在之后和/或之前本身时会发生什么。如果INC=True,则如果在循环集中找到它们,则它们将包括在列表中。
- count()¶
返回此集合中的递归次数。如果以前没有这样做过,它会经历整个循环。
- xafter(dt, count=None, inc=False)¶
发电机的产量最高可达 count 在给定DateTime实例之后的递归,等效于 after 。
- 参数:
dt -- 开始生成递归的日期时间。
count -- 要生成的最大递归次数。如果 None (默认),将生成日期,直到循环规则用完为止。
inc -- 如果 dt 是规则的实例,并且 inc 是 True ,则它包含在输出中。
- 收益率:
产生一系列 datetime 对象。
功能¶
- dateutil.rrule.rrulestr(s, **kwargs)¶
分析一个或一组重复规则的字符串表示形式。
- 参数:
s -- 必填项,定义一个或多个重复规则的字符串。
dtstart -- 如果指定,如果未在规则字符串中指定,则用作默认重复开始。
cache -- 如果已设置
True
将启用结果缓存,从而显著提高多个查询的性能。unfold -- 如果已设置
True
表示规则字符串拆分在多行上,应在处理之前联接。forceset -- 如果已设置
True
强制adateutil.rrule.rruleset
将被退还。compatible -- 如果已设置
True
力量unfold
和forceset
成为True
。ignoretz -- 如果已设置
True
,解析字符串中的时区将被忽略,并且一个朴素的datetime.datetime
对象,则返回。tzids -- 如果给定,则为用于检索
datetime.tzinfo
从字符串表示形式。默认为dateutil.tz.gettz()
。tzinfos -- 可能以字符串表示形式出现的其他时区名称/别名。看见
dateutil.parser.parse()
了解更多信息。
- 返回:
rrule示例¶
这些示例是从RFC转换而来的。
准备好环境。
>>> from dateutil.rrule import *
>>> from dateutil.parser import *
>>> from datetime import *
>>> import pprint
>>> import sys
>>> sys.displayhook = pprint.pprint
每天10次。
>>> list(rrule(DAILY, count=10,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 3, 9, 0),
datetime.datetime(1997, 9, 4, 9, 0),
datetime.datetime(1997, 9, 5, 9, 0),
datetime.datetime(1997, 9, 6, 9, 0),
datetime.datetime(1997, 9, 7, 9, 0),
datetime.datetime(1997, 9, 8, 9, 0),
datetime.datetime(1997, 9, 9, 9, 0),
datetime.datetime(1997, 9, 10, 9, 0),
datetime.datetime(1997, 9, 11, 9, 0)]
1997年12月24日前每天
>>> list(rrule(DAILY,
... dtstart=parse("19970902T090000"),
... until=parse("19971224T000000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 3, 9, 0),
datetime.datetime(1997, 9, 4, 9, 0),
...
datetime.datetime(1997, 12, 21, 9, 0),
datetime.datetime(1997, 12, 22, 9, 0),
datetime.datetime(1997, 12, 23, 9, 0)]
每隔一天发生5次。
>>> list(rrule(DAILY, interval=2, count=5,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 4, 9, 0),
datetime.datetime(1997, 9, 6, 9, 0),
datetime.datetime(1997, 9, 8, 9, 0),
datetime.datetime(1997, 9, 10, 9, 0)]
每10天发生5次。
>>> list(rrule(DAILY, interval=10, count=5,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 12, 9, 0),
datetime.datetime(1997, 9, 22, 9, 0),
datetime.datetime(1997, 10, 2, 9, 0),
datetime.datetime(1997, 10, 12, 9, 0)]
一月份的每一天,连续三年。
>>> list(rrule(YEARLY, bymonth=1, byweekday=range(7),
... dtstart=parse("19980101T090000"),
... until=parse("20000131T090000")))
[datetime.datetime(1998, 1, 1, 9, 0),
datetime.datetime(1998, 1, 2, 9, 0),
...
datetime.datetime(1998, 1, 30, 9, 0),
datetime.datetime(1998, 1, 31, 9, 0),
datetime.datetime(1999, 1, 1, 9, 0),
datetime.datetime(1999, 1, 2, 9, 0),
...
datetime.datetime(1999, 1, 30, 9, 0),
datetime.datetime(1999, 1, 31, 9, 0),
datetime.datetime(2000, 1, 1, 9, 0),
datetime.datetime(2000, 1, 2, 9, 0),
...
datetime.datetime(2000, 1, 30, 9, 0),
datetime.datetime(2000, 1, 31, 9, 0)]
同样的事情,在另一方面。
>>> list(rrule(DAILY, bymonth=1,
... dtstart=parse("19980101T090000"),
... until=parse("20000131T090000")))
[datetime.datetime(1998, 1, 1, 9, 0),
...
datetime.datetime(2000, 1, 31, 9, 0)]
每周10次。
>>> list(rrule(WEEKLY, count=10,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 9, 9, 0),
datetime.datetime(1997, 9, 16, 9, 0),
datetime.datetime(1997, 9, 23, 9, 0),
datetime.datetime(1997, 9, 30, 9, 0),
datetime.datetime(1997, 10, 7, 9, 0),
datetime.datetime(1997, 10, 14, 9, 0),
datetime.datetime(1997, 10, 21, 9, 0),
datetime.datetime(1997, 10, 28, 9, 0),
datetime.datetime(1997, 11, 4, 9, 0)]
每隔一周,发生6次。
>>> list(rrule(WEEKLY, interval=2, count=6,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 16, 9, 0),
datetime.datetime(1997, 9, 30, 9, 0),
datetime.datetime(1997, 10, 14, 9, 0),
datetime.datetime(1997, 10, 28, 9, 0),
datetime.datetime(1997, 11, 11, 9, 0)]
每周二和周四各一次,持续5周。
>>> list(rrule(WEEKLY, count=10, wkst=SU, byweekday=(TU,TH),
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 4, 9, 0),
datetime.datetime(1997, 9, 9, 9, 0),
datetime.datetime(1997, 9, 11, 9, 0),
datetime.datetime(1997, 9, 16, 9, 0),
datetime.datetime(1997, 9, 18, 9, 0),
datetime.datetime(1997, 9, 23, 9, 0),
datetime.datetime(1997, 9, 25, 9, 0),
datetime.datetime(1997, 9, 30, 9, 0),
datetime.datetime(1997, 10, 2, 9, 0)]
每隔一周的周二和周四,共发生8次。
>>> list(rrule(WEEKLY, interval=2, count=8,
... wkst=SU, byweekday=(TU,TH),
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 4, 9, 0),
datetime.datetime(1997, 9, 16, 9, 0),
datetime.datetime(1997, 9, 18, 9, 0),
datetime.datetime(1997, 9, 30, 9, 0),
datetime.datetime(1997, 10, 2, 9, 0),
datetime.datetime(1997, 10, 14, 9, 0),
datetime.datetime(1997, 10, 16, 9, 0)]
每月第一个星期五发生10次。
>>> list(rrule(MONTHLY, count=10, byweekday=FR(1),
... dtstart=parse("19970905T090000")))
[datetime.datetime(1997, 9, 5, 9, 0),
datetime.datetime(1997, 10, 3, 9, 0),
datetime.datetime(1997, 11, 7, 9, 0),
datetime.datetime(1997, 12, 5, 9, 0),
datetime.datetime(1998, 1, 2, 9, 0),
datetime.datetime(1998, 2, 6, 9, 0),
datetime.datetime(1998, 3, 6, 9, 0),
datetime.datetime(1998, 4, 3, 9, 0),
datetime.datetime(1998, 5, 1, 9, 0),
datetime.datetime(1998, 6, 5, 9, 0)]
每隔一个月的第一个星期天和最后一个星期天发生10次。
>>> list(rrule(MONTHLY, interval=2, count=10,
... byweekday=(SU(1), SU(-1)),
... dtstart=parse("19970907T090000")))
[datetime.datetime(1997, 9, 7, 9, 0),
datetime.datetime(1997, 9, 28, 9, 0),
datetime.datetime(1997, 11, 2, 9, 0),
datetime.datetime(1997, 11, 30, 9, 0),
datetime.datetime(1998, 1, 4, 9, 0),
datetime.datetime(1998, 1, 25, 9, 0),
datetime.datetime(1998, 3, 1, 9, 0),
datetime.datetime(1998, 3, 29, 9, 0),
datetime.datetime(1998, 5, 3, 9, 0),
datetime.datetime(1998, 5, 31, 9, 0)]
每月的第二至最后一个星期一,为期6个月。
>>> list(rrule(MONTHLY, count=6, byweekday=MO(-2),
... dtstart=parse("19970922T090000")))
[datetime.datetime(1997, 9, 22, 9, 0),
datetime.datetime(1997, 10, 20, 9, 0),
datetime.datetime(1997, 11, 17, 9, 0),
datetime.datetime(1997, 12, 22, 9, 0),
datetime.datetime(1998, 1, 19, 9, 0),
datetime.datetime(1998, 2, 16, 9, 0)]
每月的第三天到最后一天,为期6个月。
>>> list(rrule(MONTHLY, count=6, bymonthday=-3,
... dtstart=parse("19970928T090000")))
[datetime.datetime(1997, 9, 28, 9, 0),
datetime.datetime(1997, 10, 29, 9, 0),
datetime.datetime(1997, 11, 28, 9, 0),
datetime.datetime(1997, 12, 29, 9, 0),
datetime.datetime(1998, 1, 29, 9, 0),
datetime.datetime(1998, 2, 26, 9, 0)]
每月2号和15号发生5次。
>>> list(rrule(MONTHLY, count=5, bymonthday=(2,15),
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 15, 9, 0),
datetime.datetime(1997, 10, 2, 9, 0),
datetime.datetime(1997, 10, 15, 9, 0),
datetime.datetime(1997, 11, 2, 9, 0)]
每月的第一天和最后一天发生3次。
>>> list(rrule(MONTHLY, count=5, bymonthday=(-1,1,),
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 30, 9, 0),
datetime.datetime(1997, 10, 1, 9, 0),
datetime.datetime(1997, 10, 31, 9, 0),
datetime.datetime(1997, 11, 1, 9, 0),
datetime.datetime(1997, 11, 30, 9, 0)]
每18个月10日至15日发生10次。
>>> list(rrule(MONTHLY, interval=18, count=10,
... bymonthday=range(10,16),
... dtstart=parse("19970910T090000")))
[datetime.datetime(1997, 9, 10, 9, 0),
datetime.datetime(1997, 9, 11, 9, 0),
datetime.datetime(1997, 9, 12, 9, 0),
datetime.datetime(1997, 9, 13, 9, 0),
datetime.datetime(1997, 9, 14, 9, 0),
datetime.datetime(1997, 9, 15, 9, 0),
datetime.datetime(1999, 3, 10, 9, 0),
datetime.datetime(1999, 3, 11, 9, 0),
datetime.datetime(1999, 3, 12, 9, 0),
datetime.datetime(1999, 3, 13, 9, 0)]
每周二,每隔一个月,发生6次。
>>> list(rrule(MONTHLY, interval=2, count=6, byweekday=TU,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 9, 9, 0),
datetime.datetime(1997, 9, 16, 9, 0),
datetime.datetime(1997, 9, 23, 9, 0),
datetime.datetime(1997, 9, 30, 9, 0),
datetime.datetime(1997, 11, 4, 9, 0)]
每年6月和7月发生10次。
>>> list(rrule(YEARLY, count=4, bymonth=(6,7),
... dtstart=parse("19970610T090000")))
[datetime.datetime(1997, 6, 10, 9, 0),
datetime.datetime(1997, 7, 10, 9, 0),
datetime.datetime(1998, 6, 10, 9, 0),
datetime.datetime(1998, 7, 10, 9, 0)]
每三年第1天、第100天和第200天发生4次。
>>> list(rrule(YEARLY, count=4, interval=3, byyearday=(1,100,200),
... dtstart=parse("19970101T090000")))
[datetime.datetime(1997, 1, 1, 9, 0),
datetime.datetime(1997, 4, 10, 9, 0),
datetime.datetime(1997, 7, 19, 9, 0),
datetime.datetime(2000, 1, 1, 9, 0)]
每年的第20个星期一,发生3次。
>>> list(rrule(YEARLY, count=3, byweekday=MO(20),
... dtstart=parse("19970519T090000")))
[datetime.datetime(1997, 5, 19, 9, 0),
datetime.datetime(1998, 5, 18, 9, 0),
datetime.datetime(1999, 5, 17, 9, 0)]
第20周的星期一(其中默认的星期一开始是星期一),发生3次。
>>> list(rrule(YEARLY, count=3, byweekno=20, byweekday=MO,
... dtstart=parse("19970512T090000")))
[datetime.datetime(1997, 5, 12, 9, 0),
datetime.datetime(1998, 5, 11, 9, 0),
datetime.datetime(1999, 5, 17, 9, 0)]
第1周可能在去年。
>>> list(rrule(WEEKLY, count=3, byweekno=1, byweekday=MO,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 12, 29, 9, 0),
datetime.datetime(1999, 1, 4, 9, 0),
datetime.datetime(2000, 1, 3, 9, 0)]
而周数大于51的可能是明年。
>>> list(rrule(WEEKLY, count=3, byweekno=52, byweekday=SU,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 12, 28, 9, 0),
datetime.datetime(1998, 12, 27, 9, 0),
datetime.datetime(2000, 1, 2, 9, 0)]
只有一些年份有第53周:
>>> list(rrule(WEEKLY, count=3, byweekno=53, byweekday=MO,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1998, 12, 28, 9, 0),
datetime.datetime(2004, 12, 27, 9, 0),
datetime.datetime(2009, 12, 28, 9, 0)]
每周五13号,4次。
>>> list(rrule(YEARLY, count=4, byweekday=FR, bymonthday=13,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1998, 2, 13, 9, 0),
datetime.datetime(1998, 3, 13, 9, 0),
datetime.datetime(1998, 11, 13, 9, 0),
datetime.datetime(1999, 8, 13, 9, 0)]
每四年,即11月星期一后的第一个星期二,发生3次(美国总统选举日):
>>> list(rrule(YEARLY, interval=4, count=3, bymonth=11,
... byweekday=TU, bymonthday=(2,3,4,5,6,7,8),
... dtstart=parse("19961105T090000")))
[datetime.datetime(1996, 11, 5, 9, 0),
datetime.datetime(2000, 11, 7, 9, 0),
datetime.datetime(2004, 11, 2, 9, 0)]
在接下来的3个月内,星期二、星期三或星期四中的一个月内的第三个实例:
>>> list(rrule(MONTHLY, count=3, byweekday=(TU,WE,TH),
... bysetpos=3, dtstart=parse("19970904T090000")))
[datetime.datetime(1997, 9, 4, 9, 0),
datetime.datetime(1997, 10, 7, 9, 0),
datetime.datetime(1997, 11, 6, 9, 0)]
每月的第二个工作日到最后一个工作日,发生3次。
>>> list(rrule(MONTHLY, count=3, byweekday=(MO,TU,WE,TH,FR),
... bysetpos=-2, dtstart=parse("19970929T090000")))
[datetime.datetime(1997, 9, 29, 9, 0),
datetime.datetime(1997, 10, 30, 9, 0),
datetime.datetime(1997, 11, 27, 9, 0)]
每3小时从上午9:00到下午5:00。
>>> list(rrule(HOURLY, interval=3,
... dtstart=parse("19970902T090000"),
... until=parse("19970902T170000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 2, 12, 0),
datetime.datetime(1997, 9, 2, 15, 0)]
每15分钟发生6次。
>>> list(rrule(MINUTELY, interval=15, count=6,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 2, 9, 15),
datetime.datetime(1997, 9, 2, 9, 30),
datetime.datetime(1997, 9, 2, 9, 45),
datetime.datetime(1997, 9, 2, 10, 0),
datetime.datetime(1997, 9, 2, 10, 15)]
每小时半发生4次。
>>> list(rrule(MINUTELY, interval=90, count=4,
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 2, 10, 30),
datetime.datetime(1997, 9, 2, 12, 0),
datetime.datetime(1997, 9, 2, 13, 30)]
每20分钟从上午9:00到下午4:40,连续两天。
>>> list(rrule(MINUTELY, interval=20, count=48,
... byhour=range(9,17), byminute=(0,20,40),
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 2, 9, 20),
...
datetime.datetime(1997, 9, 2, 16, 20),
datetime.datetime(1997, 9, 2, 16, 40),
datetime.datetime(1997, 9, 3, 9, 0),
datetime.datetime(1997, 9, 3, 9, 20),
...
datetime.datetime(1997, 9, 3, 16, 20),
datetime.datetime(1997, 9, 3, 16, 40)]
一个示例,其中生成的天数因 wkst .
>>> list(rrule(WEEKLY, interval=2, count=4,
... byweekday=(TU,SU), wkst=MO,
... dtstart=parse("19970805T090000")))
[datetime.datetime(1997, 8, 5, 9, 0),
datetime.datetime(1997, 8, 10, 9, 0),
datetime.datetime(1997, 8, 19, 9, 0),
datetime.datetime(1997, 8, 24, 9, 0)]
>>> list(rrule(WEEKLY, interval=2, count=4,
... byweekday=(TU,SU), wkst=SU,
... dtstart=parse("19970805T090000")))
[datetime.datetime(1997, 8, 5, 9, 0),
datetime.datetime(1997, 8, 17, 9, 0),
datetime.datetime(1997, 8, 19, 9, 0),
datetime.datetime(1997, 8, 31, 9, 0)]
rruleset示例¶
每天,连续7天,星期六和星期天跳跃。
>>> set = rruleset()
>>> set.rrule(rrule(DAILY, count=7,
... dtstart=parse("19970902T090000")))
>>> set.exrule(rrule(YEARLY, byweekday=(SA,SU),
... dtstart=parse("19970902T090000")))
>>> list(set)
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 3, 9, 0),
datetime.datetime(1997, 9, 4, 9, 0),
datetime.datetime(1997, 9, 5, 9, 0),
datetime.datetime(1997, 9, 8, 9, 0)]
每周,持续4周,第7天加一次,而不是第16天。
>>> set = rruleset()
>>> set.rrule(rrule(WEEKLY, count=4,
... dtstart=parse("19970902T090000")))
>>> set.rdate(datetime.datetime(1997, 9, 7, 9, 0))
>>> set.exdate(datetime.datetime(1997, 9, 16, 9, 0))
>>> list(set)
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 7, 9, 0),
datetime.datetime(1997, 9, 9, 9, 0),
datetime.datetime(1997, 9, 23, 9, 0)]
rrulestr()示例¶
每10天发生5次。
>>> list(rrulestr("""
... DTSTART:19970902T090000
... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
... """))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 12, 9, 0),
datetime.datetime(1997, 9, 22, 9, 0),
datetime.datetime(1997, 10, 2, 9, 0),
datetime.datetime(1997, 10, 12, 9, 0)]
同样的事情,但是只传递 RRULE 价值。
>>> list(rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5",
... dtstart=parse("19970902T090000")))
[datetime.datetime(1997, 9, 2, 9, 0),
datetime.datetime(1997, 9, 12, 9, 0),
datetime.datetime(1997, 9, 22, 9, 0),
datetime.datetime(1997, 10, 2, 9, 0),
datetime.datetime(1997, 10, 12, 9, 0)]
注意,当使用单个规则时,它返回一个 rrule 实例,除非 forceset 使用。
>>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5")
<dateutil.rrule.rrule object at 0x...>
>>> rrulestr("""
... DTSTART:19970902T090000
... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
... """)
<dateutil.rrule.rrule object at 0x...>
>>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5", forceset=True)
<dateutil.rrule.rruleset object at 0x...>
但是当一个 rruleset 如果需要,则自动使用。
>>> rrulestr("""
... DTSTART:19970902T090000
... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
... RRULE:FREQ=DAILY;INTERVAL=5;COUNT=3
... """)
<dateutil.rrule.rruleset object at 0x...>