拉鲁尔

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)[源代码]

这就是规则操作的基础。它接受在RFC中定义的所有关键字作为其构造函数参数(除了ByDay,它被重命名为ByWeekDay)等等。构造函数原型是:

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表示每两年一次,而对于每小时,间隔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 --

    如果给定,则必须是一个日期时间实例,指定重复周期的上限。规则中的最后一个重复周期是小于或等于中指定的值的最大日期时间。 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;如果将byweekday与(mo、tu、we、th、fr)结合使用,则将导致每个月的最后一个工作日。

  • bymonth -- 如果给定,它必须是整数或整数序列,这意味着要应用重复周期的月份。

  • bymonthday -- 如果给定,则它必须是整数或整数序列,这意味着应用重复周期的月份天数。

  • byyearday -- 如果给定,则它必须是整数或整数序列,这意味着要应用重复周期的年份天数。

  • byeaster -- 如果给定,它必须是一个整数,或者是一个整数序列,正的或负的。每个整数都将定义一个与复活节星期日的偏移量。将偏移量0传递到byeaster将生成复活节星期日本身。这是对RFC规范的扩展。

  • byweekno -- 如果给定,它必须是整数或整数序列,这意味着要应用递归的周数。周数的含义如ISO8601所述,也就是说,一年中的第一周至少包含新年的四天。

  • byweekday -- 如果给定,它必须是整数(0==mo)、整数序列、工作日常量之一(mo、tu等)或这些常量的序列。如果给定,这些变量将定义将应用定期的工作日。对于工作日实例,也可以使用参数n,这意味着该期间中该工作日的第n次出现。例如,对于Monthly或Yearly和ByMonth,在ByWeekDay中使用fr(+1)将指定发生重复的月份的第一个星期五。请注意,在RFC文档中,这被指定为byday,但被重命名以避免该关键字的模糊性。

  • byhour -- 如果给定,它必须是一个整数,或者是一个整数序列,这意味着应用循环的时间。

  • byminute -- 如果给定,则它必须是整数或整数序列,这意味着应用循环的分钟数。

  • bysecond -- 如果给定,它必须是整数或整数序列,这意味着应用循环的秒数。

  • cache -- 如果给定,它必须是一个指定的布尔值,以启用或禁用结果缓存。如果您将多次使用同一个规则实例,启用缓存将大大提高性能。

after(dt, inc=False)

返回给定日期时间实例之后的第一个重复项。inc关键字定义dt是一个事件时发生的情况。inc=True时,如果dt本身是一个事件,则返回它。

before(dt, inc=False)

返回给定datetime实例之前的最后一次循环。inc关键字定义dt是一个事件时发生的情况。inc=True时,如果dt本身是一个事件,则返回它。

between(after, before, inc=False, count=1)

返回在之前和之后发生的所有rrule。inc关键字定义如果after和/或before本身是发生的情况,则会发生什么。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)

返回给定日期时间实例之后的第一个重复项。inc关键字定义dt是一个事件时发生的情况。inc=True时,如果dt本身是一个事件,则返回它。

before(dt, inc=False)

返回给定datetime实例之前的最后一次循环。inc关键字定义dt是一个事件时发生的情况。inc=True时,如果dt本身是一个事件,则返回它。

between(after, before, inc=False, count=1)

返回在之前和之后发生的所有rrule。inc关键字定义如果after和/或before本身是发生的情况,则会发生什么。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() 更多信息。

返回

返回A 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...>