拉鲁尔

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 with count is deprecated, to make sure dateutil is fully compliant with RFC-5545 Sec. 3.3.10. Therefore, until and count must not occur in the same call to rrule.

  • until --

    如果给定,这必须是指定重复上限的DateTime实例。规则中的最后一次重复是小于或等于中指定的值的最大日期时间 until 参数。

    备注

    As of version 2.5.0, the use of the keyword until in conjunction with count is deprecated, to make sure dateutil is fully compliant with RFC-5545 Sec. 3.3.10. Therefore, until and count must not occur in the same call to rrule.

  • 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()

返回此集合中的递归次数。如果以前没有这样做过,它会经历整个循环。

replace(**kwargs)[源代码]

返回具有相同属性的新rRule,但指定的关键字参数为新值的属性除外。

xafter(dt, count=None, inc=False)

发电机的产量最高可达 count 在给定DateTime实例之后的递归,等效于 after

参数:
  • dt -- 开始生成递归的日期时间。

  • count -- 要生成的最大递归次数。如果 None (默认),将生成日期,直到循环规则用完为止。

  • inc -- 如果 dt 是规则的实例,并且 incTrue ,则它包含在输出中。

收益率:

产生一系列 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()

返回此集合中的递归次数。如果以前没有这样做过,它会经历整个循环。

exdate(exdate)[源代码]

将给定的DateTime实例包括在重复项集排除列表中。即使某些包含的rRule或rdate与其匹配,也不会生成以这种方式包含的日期。

exrule(exrule)[源代码]

将给定的rRule实例包括在重复项集排除列表中。不会生成属于给定重复规则一部分的日期,即使某些包含的rRule或rdate与它们匹配也是如此。

rdate(rdate)[源代码]

包括给定的 datetime 实例在循环集生成中。

rrule(rrule)[源代码]

包括给定的 rrule 实例在循环集生成中。

xafter(dt, count=None, inc=False)

发电机的产量最高可达 count 在给定DateTime实例之后的递归,等效于 after

参数:
  • dt -- 开始生成递归的日期时间。

  • count -- 要生成的最大递归次数。如果 None (默认),将生成日期,直到循环规则用完为止。

  • inc -- 如果 dt 是规则的实例,并且 incTrue ,则它包含在输出中。

收益率:

产生一系列 datetime 对象。

功能

dateutil.rrule.rrulestr(s, **kwargs)

分析一个或一组重复规则的字符串表示形式。

参数:
  • s -- 必填项,定义一个或多个重复规则的字符串。

  • dtstart -- 如果指定,如果未在规则字符串中指定,则用作默认重复开始。

  • cache -- 如果已设置 True 将启用结果缓存,从而显著提高多个查询的性能。

  • unfold -- 如果已设置 True 表示规则字符串拆分在多行上,应在处理之前联接。

  • forceset -- 如果已设置 True 强制a dateutil.rrule.rruleset 将被退还。

  • compatible -- 如果已设置 True 力量 unfoldforceset 成为 True

  • ignoretz -- 如果已设置 True ,解析字符串中的时区将被忽略,并且一个朴素的 datetime.datetime 对象,则返回。

  • tzids -- 如果给定,则为用于检索 datetime.tzinfo 从字符串表示形式。默认为 dateutil.tz.gettz()

  • tzinfos -- 可能以字符串表示形式出现的其他时区名称/别名。看见 dateutil.parser.parse() 了解更多信息。

返回:

返回一个 dateutil.rrule.rrulesetdateutil.rrule.rrule

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...>