blob: 0e54fdbccbe021ab2a17a0e49c74edfb10319b80 [file] [log] [blame]
Yaron de Leeuw1e586cb2014-11-22 22:30:35 +02001=====
2rrule
3=====
Yaron de Leeuw1e586cb2014-11-22 22:30:35 +02004
5.. automodule:: dateutil.rrule
6 :members:
7 :undoc-members:
Tomasz-Kluczkowski2e8a4772017-12-06 20:35:06 +00008
9rrule examples
10--------------
11These examples were converted from the RFC.
12
13Prepare the environment.
14
15.. testsetup:: rrule
16
17 from dateutil.rrule import *
18 from dateutil.parser import *
19 from datetime import *
20 import pprint
21 import sys
22 sys.displayhook = pprint.pprint
23
24.. doctest:: rrule
25
26 >>> from dateutil.rrule import *
27 >>> from dateutil.parser import *
28 >>> from datetime import *
29
30 >>> import pprint
31 >>> import sys
32 >>> sys.displayhook = pprint.pprint
33
34Daily, for 10 occurrences.
35
36.. doctest:: rrule
37 :options: +NORMALIZE_WHITESPACE
38
39 >>> list(rrule(DAILY, count=10,
40 ... dtstart=parse("19970902T090000")))
41 [datetime.datetime(1997, 9, 2, 9, 0),
42 datetime.datetime(1997, 9, 3, 9, 0),
43 datetime.datetime(1997, 9, 4, 9, 0),
44 datetime.datetime(1997, 9, 5, 9, 0),
45 datetime.datetime(1997, 9, 6, 9, 0),
46 datetime.datetime(1997, 9, 7, 9, 0),
47 datetime.datetime(1997, 9, 8, 9, 0),
48 datetime.datetime(1997, 9, 9, 9, 0),
49 datetime.datetime(1997, 9, 10, 9, 0),
50 datetime.datetime(1997, 9, 11, 9, 0)]
51
52Daily until December 24, 1997
53
54.. doctest:: rrule
55 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
56
57 >>> list(rrule(DAILY,
58 ... dtstart=parse("19970902T090000"),
59 ... until=parse("19971224T000000")))
60 [datetime.datetime(1997, 9, 2, 9, 0),
61 datetime.datetime(1997, 9, 3, 9, 0),
62 datetime.datetime(1997, 9, 4, 9, 0),
63 ...
64 datetime.datetime(1997, 12, 21, 9, 0),
65 datetime.datetime(1997, 12, 22, 9, 0),
66 datetime.datetime(1997, 12, 23, 9, 0)]
67
68Every other day, 5 occurrences.
69
70.. doctest:: rrule
71 :options: +NORMALIZE_WHITESPACE
72
73 >>> list(rrule(DAILY, interval=2, count=5,
74 ... dtstart=parse("19970902T090000")))
75 [datetime.datetime(1997, 9, 2, 9, 0),
76 datetime.datetime(1997, 9, 4, 9, 0),
77 datetime.datetime(1997, 9, 6, 9, 0),
78 datetime.datetime(1997, 9, 8, 9, 0),
79 datetime.datetime(1997, 9, 10, 9, 0)]
80
81Every 10 days, 5 occurrences.
82
83.. doctest:: rrule
84 :options: +NORMALIZE_WHITESPACE
85
86 >>> list(rrule(DAILY, interval=10, count=5,
87 ... dtstart=parse("19970902T090000")))
88 [datetime.datetime(1997, 9, 2, 9, 0),
89 datetime.datetime(1997, 9, 12, 9, 0),
90 datetime.datetime(1997, 9, 22, 9, 0),
91 datetime.datetime(1997, 10, 2, 9, 0),
92 datetime.datetime(1997, 10, 12, 9, 0)]
93
94Everyday in January, for 3 years.
95
96.. doctest:: rrule
97 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
98
99 >>> list(rrule(YEARLY, bymonth=1, byweekday=range(7),
100 ... dtstart=parse("19980101T090000"),
101 ... until=parse("20000131T090000")))
102 [datetime.datetime(1998, 1, 1, 9, 0),
103 datetime.datetime(1998, 1, 2, 9, 0),
104 ...
105 datetime.datetime(1998, 1, 30, 9, 0),
106 datetime.datetime(1998, 1, 31, 9, 0),
107 datetime.datetime(1999, 1, 1, 9, 0),
108 datetime.datetime(1999, 1, 2, 9, 0),
109 ...
110 datetime.datetime(1999, 1, 30, 9, 0),
111 datetime.datetime(1999, 1, 31, 9, 0),
112 datetime.datetime(2000, 1, 1, 9, 0),
113 datetime.datetime(2000, 1, 2, 9, 0),
114 ...
115 datetime.datetime(2000, 1, 30, 9, 0),
116 datetime.datetime(2000, 1, 31, 9, 0)]
117
118Same thing, in another way.
119
120.. doctest:: rrule
121 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
122
123 >>> list(rrule(DAILY, bymonth=1,
124 ... dtstart=parse("19980101T090000"),
125 ... until=parse("20000131T090000")))
126 [datetime.datetime(1998, 1, 1, 9, 0),
127 ...
128 datetime.datetime(2000, 1, 31, 9, 0)]
129
130Weekly for 10 occurrences.
131
132.. doctest:: rrule
133 :options: +NORMALIZE_WHITESPACE
134
135 >>> list(rrule(WEEKLY, count=10,
136 ... dtstart=parse("19970902T090000")))
137 [datetime.datetime(1997, 9, 2, 9, 0),
138 datetime.datetime(1997, 9, 9, 9, 0),
139 datetime.datetime(1997, 9, 16, 9, 0),
140 datetime.datetime(1997, 9, 23, 9, 0),
141 datetime.datetime(1997, 9, 30, 9, 0),
142 datetime.datetime(1997, 10, 7, 9, 0),
143 datetime.datetime(1997, 10, 14, 9, 0),
144 datetime.datetime(1997, 10, 21, 9, 0),
145 datetime.datetime(1997, 10, 28, 9, 0),
146 datetime.datetime(1997, 11, 4, 9, 0)]
147
148Every other week, 6 occurrences.
149
150.. doctest:: rrule
151 :options: +NORMALIZE_WHITESPACE
152
153 >>> list(rrule(WEEKLY, interval=2, count=6,
154 ... dtstart=parse("19970902T090000")))
155 [datetime.datetime(1997, 9, 2, 9, 0),
156 datetime.datetime(1997, 9, 16, 9, 0),
157 datetime.datetime(1997, 9, 30, 9, 0),
158 datetime.datetime(1997, 10, 14, 9, 0),
159 datetime.datetime(1997, 10, 28, 9, 0),
160 datetime.datetime(1997, 11, 11, 9, 0)]
161
162Weekly on Tuesday and Thursday for 5 weeks.
163
164.. doctest:: rrule
165 :options: +NORMALIZE_WHITESPACE
166
167 >>> list(rrule(WEEKLY, count=10, wkst=SU, byweekday=(TU,TH),
168 ... dtstart=parse("19970902T090000")))
169 [datetime.datetime(1997, 9, 2, 9, 0),
170 datetime.datetime(1997, 9, 4, 9, 0),
171 datetime.datetime(1997, 9, 9, 9, 0),
172 datetime.datetime(1997, 9, 11, 9, 0),
173 datetime.datetime(1997, 9, 16, 9, 0),
174 datetime.datetime(1997, 9, 18, 9, 0),
175 datetime.datetime(1997, 9, 23, 9, 0),
176 datetime.datetime(1997, 9, 25, 9, 0),
177 datetime.datetime(1997, 9, 30, 9, 0),
178 datetime.datetime(1997, 10, 2, 9, 0)]
179
180Every other week on Tuesday and Thursday, for 8 occurrences.
181
182.. doctest:: rrule
183 :options: +NORMALIZE_WHITESPACE
184
185 >>> list(rrule(WEEKLY, interval=2, count=8,
186 ... wkst=SU, byweekday=(TU,TH),
187 ... dtstart=parse("19970902T090000")))
188 [datetime.datetime(1997, 9, 2, 9, 0),
189 datetime.datetime(1997, 9, 4, 9, 0),
190 datetime.datetime(1997, 9, 16, 9, 0),
191 datetime.datetime(1997, 9, 18, 9, 0),
192 datetime.datetime(1997, 9, 30, 9, 0),
193 datetime.datetime(1997, 10, 2, 9, 0),
194 datetime.datetime(1997, 10, 14, 9, 0),
195 datetime.datetime(1997, 10, 16, 9, 0)]
196
197Monthly on the 1st Friday for ten occurrences.
198
199.. doctest:: rrule
200 :options: +NORMALIZE_WHITESPACE
201
202 >>> list(rrule(MONTHLY, count=10, byweekday=FR(1),
203 ... dtstart=parse("19970905T090000")))
204 [datetime.datetime(1997, 9, 5, 9, 0),
205 datetime.datetime(1997, 10, 3, 9, 0),
206 datetime.datetime(1997, 11, 7, 9, 0),
207 datetime.datetime(1997, 12, 5, 9, 0),
208 datetime.datetime(1998, 1, 2, 9, 0),
209 datetime.datetime(1998, 2, 6, 9, 0),
210 datetime.datetime(1998, 3, 6, 9, 0),
211 datetime.datetime(1998, 4, 3, 9, 0),
212 datetime.datetime(1998, 5, 1, 9, 0),
213 datetime.datetime(1998, 6, 5, 9, 0)]
214
215Every other month on the 1st and last Sunday of the month for 10 occurrences.
216
217.. doctest:: rrule
218 :options: +NORMALIZE_WHITESPACE
219
220 >>> list(rrule(MONTHLY, interval=2, count=10,
221 ... byweekday=(SU(1), SU(-1)),
222 ... dtstart=parse("19970907T090000")))
223 [datetime.datetime(1997, 9, 7, 9, 0),
224 datetime.datetime(1997, 9, 28, 9, 0),
225 datetime.datetime(1997, 11, 2, 9, 0),
226 datetime.datetime(1997, 11, 30, 9, 0),
227 datetime.datetime(1998, 1, 4, 9, 0),
228 datetime.datetime(1998, 1, 25, 9, 0),
229 datetime.datetime(1998, 3, 1, 9, 0),
230 datetime.datetime(1998, 3, 29, 9, 0),
231 datetime.datetime(1998, 5, 3, 9, 0),
232 datetime.datetime(1998, 5, 31, 9, 0)]
233
234Monthly on the second to last Monday of the month for 6 months.
235
236.. doctest:: rrule
237 :options: +NORMALIZE_WHITESPACE
238
239 >>> list(rrule(MONTHLY, count=6, byweekday=MO(-2),
240 ... dtstart=parse("19970922T090000")))
241 [datetime.datetime(1997, 9, 22, 9, 0),
242 datetime.datetime(1997, 10, 20, 9, 0),
243 datetime.datetime(1997, 11, 17, 9, 0),
244 datetime.datetime(1997, 12, 22, 9, 0),
245 datetime.datetime(1998, 1, 19, 9, 0),
246 datetime.datetime(1998, 2, 16, 9, 0)]
247
248
249Monthly on the third to the last day of the month, for 6 months.
250
251.. doctest:: rrule
252 :options: +NORMALIZE_WHITESPACE
253
254 >>> list(rrule(MONTHLY, count=6, bymonthday=-3,
255 ... dtstart=parse("19970928T090000")))
256 [datetime.datetime(1997, 9, 28, 9, 0),
257 datetime.datetime(1997, 10, 29, 9, 0),
258 datetime.datetime(1997, 11, 28, 9, 0),
259 datetime.datetime(1997, 12, 29, 9, 0),
260 datetime.datetime(1998, 1, 29, 9, 0),
261 datetime.datetime(1998, 2, 26, 9, 0)]
262
263
264Monthly on the 2nd and 15th of the month for 5 occurrences.
265
266.. doctest:: rrule
267 :options: +NORMALIZE_WHITESPACE
268
269 >>> list(rrule(MONTHLY, count=5, bymonthday=(2,15),
270 ... dtstart=parse("19970902T090000")))
271 [datetime.datetime(1997, 9, 2, 9, 0),
272 datetime.datetime(1997, 9, 15, 9, 0),
273 datetime.datetime(1997, 10, 2, 9, 0),
274 datetime.datetime(1997, 10, 15, 9, 0),
275 datetime.datetime(1997, 11, 2, 9, 0)]
276
277
278Monthly on the first and last day of the month for 3 occurrences.
279
280.. doctest:: rrule
281 :options: +NORMALIZE_WHITESPACE
282
283 >>> list(rrule(MONTHLY, count=5, bymonthday=(-1,1,),
284 ... dtstart=parse("19970902T090000")))
285 [datetime.datetime(1997, 9, 30, 9, 0),
286 datetime.datetime(1997, 10, 1, 9, 0),
287 datetime.datetime(1997, 10, 31, 9, 0),
288 datetime.datetime(1997, 11, 1, 9, 0),
289 datetime.datetime(1997, 11, 30, 9, 0)]
290
291
292Every 18 months on the 10th thru 15th of the month for 10 occurrences.
293
294.. doctest:: rrule
295 :options: +NORMALIZE_WHITESPACE
296
297 >>> list(rrule(MONTHLY, interval=18, count=10,
298 ... bymonthday=range(10,16),
299 ... dtstart=parse("19970910T090000")))
300 [datetime.datetime(1997, 9, 10, 9, 0),
301 datetime.datetime(1997, 9, 11, 9, 0),
302 datetime.datetime(1997, 9, 12, 9, 0),
303 datetime.datetime(1997, 9, 13, 9, 0),
304 datetime.datetime(1997, 9, 14, 9, 0),
305 datetime.datetime(1997, 9, 15, 9, 0),
306 datetime.datetime(1999, 3, 10, 9, 0),
307 datetime.datetime(1999, 3, 11, 9, 0),
308 datetime.datetime(1999, 3, 12, 9, 0),
309 datetime.datetime(1999, 3, 13, 9, 0)]
310
311
312Every Tuesday, every other month, 6 occurences.
313
314.. doctest:: rrule
315 :options: +NORMALIZE_WHITESPACE
316
317 >>> list(rrule(MONTHLY, interval=2, count=6, byweekday=TU,
318 ... dtstart=parse("19970902T090000")))
319 [datetime.datetime(1997, 9, 2, 9, 0),
320 datetime.datetime(1997, 9, 9, 9, 0),
321 datetime.datetime(1997, 9, 16, 9, 0),
322 datetime.datetime(1997, 9, 23, 9, 0),
323 datetime.datetime(1997, 9, 30, 9, 0),
324 datetime.datetime(1997, 11, 4, 9, 0)]
325
326
327Yearly in June and July for 10 occurrences.
328
329.. doctest:: rrule
330 :options: +NORMALIZE_WHITESPACE
331
332 >>> list(rrule(YEARLY, count=4, bymonth=(6,7),
333 ... dtstart=parse("19970610T090000")))
334 [datetime.datetime(1997, 6, 10, 9, 0),
335 datetime.datetime(1997, 7, 10, 9, 0),
336 datetime.datetime(1998, 6, 10, 9, 0),
337 datetime.datetime(1998, 7, 10, 9, 0)]
338
339
340Every 3rd year on the 1st, 100th and 200th day for 4 occurrences.
341
342.. doctest:: rrule
343 :options: +NORMALIZE_WHITESPACE
344
345 >>> list(rrule(YEARLY, count=4, interval=3, byyearday=(1,100,200),
346 ... dtstart=parse("19970101T090000")))
347 [datetime.datetime(1997, 1, 1, 9, 0),
348 datetime.datetime(1997, 4, 10, 9, 0),
349 datetime.datetime(1997, 7, 19, 9, 0),
350 datetime.datetime(2000, 1, 1, 9, 0)]
351
352
353Every 20th Monday of the year, 3 occurrences.
354
355.. doctest:: rrule
356 :options: +NORMALIZE_WHITESPACE
357
358 >>> list(rrule(YEARLY, count=3, byweekday=MO(20),
359 ... dtstart=parse("19970519T090000")))
360 [datetime.datetime(1997, 5, 19, 9, 0),
361 datetime.datetime(1998, 5, 18, 9, 0),
362 datetime.datetime(1999, 5, 17, 9, 0)]
363
364
365Monday of week number 20 (where the default start of the week is Monday),
3663 occurrences.
367
368.. doctest:: rrule
369 :options: +NORMALIZE_WHITESPACE
370
371 >>> list(rrule(YEARLY, count=3, byweekno=20, byweekday=MO,
372 ... dtstart=parse("19970512T090000")))
373 [datetime.datetime(1997, 5, 12, 9, 0),
374 datetime.datetime(1998, 5, 11, 9, 0),
375 datetime.datetime(1999, 5, 17, 9, 0)]
376
377
378The week number 1 may be in the last year.
379
380.. doctest:: rrule
381 :options: +NORMALIZE_WHITESPACE
382
383 >>> list(rrule(WEEKLY, count=3, byweekno=1, byweekday=MO,
384 ... dtstart=parse("19970902T090000")))
385 [datetime.datetime(1997, 12, 29, 9, 0),
386 datetime.datetime(1999, 1, 4, 9, 0),
387 datetime.datetime(2000, 1, 3, 9, 0)]
388
389
390And the week numbers greater than 51 may be in the next year.
391
392.. doctest:: rrule
393 :options: +NORMALIZE_WHITESPACE
394
395 >>> list(rrule(WEEKLY, count=3, byweekno=52, byweekday=SU,
396 ... dtstart=parse("19970902T090000")))
397 [datetime.datetime(1997, 12, 28, 9, 0),
398 datetime.datetime(1998, 12, 27, 9, 0),
399 datetime.datetime(2000, 1, 2, 9, 0)]
400
401
402Only some years have week number 53:
403
404.. doctest:: rrule
405 :options: +NORMALIZE_WHITESPACE
406
407 >>> list(rrule(WEEKLY, count=3, byweekno=53, byweekday=MO,
408 ... dtstart=parse("19970902T090000")))
409 [datetime.datetime(1998, 12, 28, 9, 0),
410 datetime.datetime(2004, 12, 27, 9, 0),
411 datetime.datetime(2009, 12, 28, 9, 0)]
412
413
414Every Friday the 13th, 4 occurrences.
415
416.. doctest:: rrule
417 :options: +NORMALIZE_WHITESPACE
418
419 >>> list(rrule(YEARLY, count=4, byweekday=FR, bymonthday=13,
420 ... dtstart=parse("19970902T090000")))
421 [datetime.datetime(1998, 2, 13, 9, 0),
422 datetime.datetime(1998, 3, 13, 9, 0),
423 datetime.datetime(1998, 11, 13, 9, 0),
424 datetime.datetime(1999, 8, 13, 9, 0)]
425
426
427Every four years, the first Tuesday after a Monday in November,
4283 occurrences (U.S. Presidential Election day):
429
430.. doctest:: rrule
431 :options: +NORMALIZE_WHITESPACE
432
433 >>> list(rrule(YEARLY, interval=4, count=3, bymonth=11,
434 ... byweekday=TU, bymonthday=(2,3,4,5,6,7,8),
435 ... dtstart=parse("19961105T090000")))
436 [datetime.datetime(1996, 11, 5, 9, 0),
437 datetime.datetime(2000, 11, 7, 9, 0),
438 datetime.datetime(2004, 11, 2, 9, 0)]
439
440
441The 3rd instance into the month of one of Tuesday, Wednesday or
442Thursday, for the next 3 months:
443
444.. doctest:: rrule
445 :options: +NORMALIZE_WHITESPACE
446
447 >>> list(rrule(MONTHLY, count=3, byweekday=(TU,WE,TH),
448 ... bysetpos=3, dtstart=parse("19970904T090000")))
449 [datetime.datetime(1997, 9, 4, 9, 0),
450 datetime.datetime(1997, 10, 7, 9, 0),
451 datetime.datetime(1997, 11, 6, 9, 0)]
452
453
454The 2nd to last weekday of the month, 3 occurrences.
455
456.. doctest:: rrule
457 :options: +NORMALIZE_WHITESPACE
458
459 >>> list(rrule(MONTHLY, count=3, byweekday=(MO,TU,WE,TH,FR),
460 ... bysetpos=-2, dtstart=parse("19970929T090000")))
461 [datetime.datetime(1997, 9, 29, 9, 0),
462 datetime.datetime(1997, 10, 30, 9, 0),
463 datetime.datetime(1997, 11, 27, 9, 0)]
464
465
466Every 3 hours from 9:00 AM to 5:00 PM on a specific day.
467
468.. doctest:: rrule
469 :options: +NORMALIZE_WHITESPACE
470
471 >>> list(rrule(HOURLY, interval=3,
472 ... dtstart=parse("19970902T090000"),
473 ... until=parse("19970902T170000")))
474 [datetime.datetime(1997, 9, 2, 9, 0),
475 datetime.datetime(1997, 9, 2, 12, 0),
476 datetime.datetime(1997, 9, 2, 15, 0)]
477
478
479Every 15 minutes for 6 occurrences.
480
481.. doctest:: rrule
482 :options: +NORMALIZE_WHITESPACE
483
484 >>> list(rrule(MINUTELY, interval=15, count=6,
485 ... dtstart=parse("19970902T090000")))
486 [datetime.datetime(1997, 9, 2, 9, 0),
487 datetime.datetime(1997, 9, 2, 9, 15),
488 datetime.datetime(1997, 9, 2, 9, 30),
489 datetime.datetime(1997, 9, 2, 9, 45),
490 datetime.datetime(1997, 9, 2, 10, 0),
491 datetime.datetime(1997, 9, 2, 10, 15)]
492
493
494Every hour and a half for 4 occurrences.
495
496.. doctest:: rrule
497 :options: +NORMALIZE_WHITESPACE
498
499 >>> list(rrule(MINUTELY, interval=90, count=4,
500 ... dtstart=parse("19970902T090000")))
501 [datetime.datetime(1997, 9, 2, 9, 0),
502 datetime.datetime(1997, 9, 2, 10, 30),
503 datetime.datetime(1997, 9, 2, 12, 0),
504 datetime.datetime(1997, 9, 2, 13, 30)]
505
506
507Every 20 minutes from 9:00 AM to 4:40 PM for two days.
508
509.. doctest:: rrule
510 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
511
512 >>> list(rrule(MINUTELY, interval=20, count=48,
513 ... byhour=range(9,17), byminute=(0,20,40),
514 ... dtstart=parse("19970902T090000")))
515 [datetime.datetime(1997, 9, 2, 9, 0),
516 datetime.datetime(1997, 9, 2, 9, 20),
517 ...
518 datetime.datetime(1997, 9, 2, 16, 20),
519 datetime.datetime(1997, 9, 2, 16, 40),
520 datetime.datetime(1997, 9, 3, 9, 0),
521 datetime.datetime(1997, 9, 3, 9, 20),
522 ...
523 datetime.datetime(1997, 9, 3, 16, 20),
524 datetime.datetime(1997, 9, 3, 16, 40)]
525
526
527An example where the days generated makes a difference because of `wkst`.
528
529.. doctest:: rrule
530 :options: +NORMALIZE_WHITESPACE
531
532 >>> list(rrule(WEEKLY, interval=2, count=4,
533 ... byweekday=(TU,SU), wkst=MO,
534 ... dtstart=parse("19970805T090000")))
535 [datetime.datetime(1997, 8, 5, 9, 0),
536 datetime.datetime(1997, 8, 10, 9, 0),
537 datetime.datetime(1997, 8, 19, 9, 0),
538 datetime.datetime(1997, 8, 24, 9, 0)]
539
540 >>> list(rrule(WEEKLY, interval=2, count=4,
541 ... byweekday=(TU,SU), wkst=SU,
542 ... dtstart=parse("19970805T090000")))
543 [datetime.datetime(1997, 8, 5, 9, 0),
544 datetime.datetime(1997, 8, 17, 9, 0),
545 datetime.datetime(1997, 8, 19, 9, 0),
546 datetime.datetime(1997, 8, 31, 9, 0)]
547
548
549rruleset examples
550-----------------
551Daily, for 7 days, jumping Saturday and Sunday occurrences.
552
553.. testsetup:: rruleset
554
555 import datetime
556
557 from dateutil.parser import parse
558 from dateutil.rrule import rrule, rruleset
559 from dateutil.rrule import YEARLY, MONTHLY, WEEKLY, DAILY
560 from dateutil.rrule import MO, TU, WE, TH, FR, SA, SU
561
562 import pprint
563 import sys
564 sys.displayhook = pprint.pprint
565
566.. doctest:: rruleset
567 :options: +NORMALIZE_WHITESPACE
568
569 >>> set = rruleset()
570 >>> set.rrule(rrule(DAILY, count=7,
571 ... dtstart=parse("19970902T090000")))
572 >>> set.exrule(rrule(YEARLY, byweekday=(SA,SU),
573 ... dtstart=parse("19970902T090000")))
574 >>> list(set)
575 [datetime.datetime(1997, 9, 2, 9, 0),
576 datetime.datetime(1997, 9, 3, 9, 0),
577 datetime.datetime(1997, 9, 4, 9, 0),
578 datetime.datetime(1997, 9, 5, 9, 0),
579 datetime.datetime(1997, 9, 8, 9, 0)]
580
581
582Weekly, for 4 weeks, plus one time on day 7, and not on day 16.
583
584.. doctest:: rruleset
585 :options: +NORMALIZE_WHITESPACE
586
587 >>> set = rruleset()
588 >>> set.rrule(rrule(WEEKLY, count=4,
589 ... dtstart=parse("19970902T090000")))
590 >>> set.rdate(datetime.datetime(1997, 9, 7, 9, 0))
591 >>> set.exdate(datetime.datetime(1997, 9, 16, 9, 0))
592 >>> list(set)
593 [datetime.datetime(1997, 9, 2, 9, 0),
594 datetime.datetime(1997, 9, 7, 9, 0),
595 datetime.datetime(1997, 9, 9, 9, 0),
596 datetime.datetime(1997, 9, 23, 9, 0)]
597
598
599rrulestr() examples
600-------------------
601
602Every 10 days, 5 occurrences.
603
604.. testsetup:: rrulestr
605
606 from dateutil.parser import parse
607 from dateutil.rrule import rruleset, rrulestr
608
609 import pprint
610 import sys
611 sys.displayhook = pprint.pprint
612
613.. doctest:: rrulestr
614 :options: +NORMALIZE_WHITESPACE
615
616 >>> list(rrulestr("""
617 ... DTSTART:19970902T090000
618 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
619 ... """))
620 [datetime.datetime(1997, 9, 2, 9, 0),
621 datetime.datetime(1997, 9, 12, 9, 0),
622 datetime.datetime(1997, 9, 22, 9, 0),
623 datetime.datetime(1997, 10, 2, 9, 0),
624 datetime.datetime(1997, 10, 12, 9, 0)]
625
626
627Same thing, but passing only the `RRULE` value.
628
629.. doctest:: rrulestr
630 :options: +NORMALIZE_WHITESPACE
631
632 >>> list(rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5",
633 ... dtstart=parse("19970902T090000")))
634 [datetime.datetime(1997, 9, 2, 9, 0),
635 datetime.datetime(1997, 9, 12, 9, 0),
636 datetime.datetime(1997, 9, 22, 9, 0),
637 datetime.datetime(1997, 10, 2, 9, 0),
638 datetime.datetime(1997, 10, 12, 9, 0)]
639
640
641Notice that when using a single rule, it returns an
642`rrule` instance, unless `forceset` was used.
643
644.. doctest:: rrulestr
645 :options: +ELLIPSIS
646
647 >>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5")
648 <dateutil.rrule.rrule object at 0x...>
649
650 >>> rrulestr("""
651 ... DTSTART:19970902T090000
652 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
653 ... """)
654 <dateutil.rrule.rrule object at 0x...>
655
656 >>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5", forceset=True)
657 <dateutil.rrule.rruleset object at 0x...>
658
659
660But when an `rruleset` is needed, it is automatically used.
661
662.. doctest:: rrulestr
663 :options: +ELLIPSIS
664
665 >>> rrulestr("""
666 ... DTSTART:19970902T090000
667 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
668 ... RRULE:FREQ=DAILY;INTERVAL=5;COUNT=3
669 ... """)
670 <dateutil.rrule.rruleset object at 0x...>