blob: 86b28b2bd7f87a5087b91a9d0268378601f33630 [file] [log] [blame]
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001dateutil examples
2=================
3
4.. contents::
5
6relativedelta examples
7----------------------
8
9.. testsetup:: relativedelta
10
11 from datetime import *; from dateutil.relativedelta import *
12 import calendar
13 NOW = datetime(2003, 9, 17, 20, 54, 47, 282310)
14 TODAY = date(2003, 9, 17)
15
16Let's begin our trip::
17
18 >>> from datetime import *; from dateutil.relativedelta import *
19 >>> import calendar
20
21Store some values::
22
23 >>> NOW = datetime.now()
24 >>> TODAY = date.today()
25 >>> NOW
26 datetime.datetime(2003, 9, 17, 20, 54, 47, 282310)
27 >>> TODAY
28 datetime.date(2003, 9, 17)
29
30Next month
31
32.. doctest:: relativedelta
33
34 >>> NOW+relativedelta(months=+1)
35 datetime.datetime(2003, 10, 17, 20, 54, 47, 282310)
36
37Next month, plus one week.
38
39.. doctest:: relativedelta
40
41 >>> NOW+relativedelta(months=+1, weeks=+1)
42 datetime.datetime(2003, 10, 24, 20, 54, 47, 282310)
43
44Next month, plus one week, at 10am.
45
46.. doctest:: relativedelta
47
48 >>> TODAY+relativedelta(months=+1, weeks=+1, hour=10)
49 datetime.datetime(2003, 10, 24, 10, 0)
50
David Lehrian15ce30c2014-12-28 13:25:07 -080051Here is another example using an absolute relativedelta. Notice the use of
52year and month (both singular) which causes the values to be *replaced* in the
53original datetime rather than performing an arithmetic operation on them.
54
55.. doctest:: relativedelta
56
57 >>> NOW+relativedelta(year=1, month=1)
Alex Willmer09611c52015-09-06 10:39:30 +010058 datetime.datetime(1, 1, 17, 20, 54, 47, 282310)
David Lehrian15ce30c2014-12-28 13:25:07 -080059
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +020060Let's try the other way around. Notice that the
61hour setting we get in the relativedelta is relative,
62since it's a difference, and the weeks parameter
63has gone.
64
65.. doctest:: relativedelta
66
67 >>> relativedelta(datetime(2003, 10, 24, 10, 0), TODAY)
68 relativedelta(months=+1, days=+7, hours=+10)
69
70One month before one year.
71
72.. doctest:: relativedelta
73
74 >>> NOW+relativedelta(years=+1, months=-1)
75 datetime.datetime(2004, 8, 17, 20, 54, 47, 282310)
76
77How does it handle months with different numbers of days?
78Notice that adding one month will never cross the month
79boundary.
80
81.. doctest:: relativedelta
82
83 >>> date(2003,1,27)+relativedelta(months=+1)
84 datetime.date(2003, 2, 27)
85 >>> date(2003,1,31)+relativedelta(months=+1)
86 datetime.date(2003, 2, 28)
87 >>> date(2003,1,31)+relativedelta(months=+2)
88 datetime.date(2003, 3, 31)
89
90The logic for years is the same, even on leap years.
91
92.. doctest:: relativedelta
93
94 >>> date(2000,2,28)+relativedelta(years=+1)
95 datetime.date(2001, 2, 28)
96 >>> date(2000,2,29)+relativedelta(years=+1)
97 datetime.date(2001, 2, 28)
98
99 >>> date(1999,2,28)+relativedelta(years=+1)
100 datetime.date(2000, 2, 28)
101 >>> date(1999,3,1)+relativedelta(years=+1)
102 datetime.date(2000, 3, 1)
103
104 >>> date(2001,2,28)+relativedelta(years=-1)
105 datetime.date(2000, 2, 28)
106 >>> date(2001,3,1)+relativedelta(years=-1)
107 datetime.date(2000, 3, 1)
108
109Next friday
110
111.. doctest:: relativedelta
112
113 >>> TODAY+relativedelta(weekday=FR)
114 datetime.date(2003, 9, 19)
115
116 >>> TODAY+relativedelta(weekday=calendar.FRIDAY)
117 datetime.date(2003, 9, 19)
118
119Last friday in this month.
120
121.. doctest:: relativedelta
122
123 >>> TODAY+relativedelta(day=31, weekday=FR(-1))
124 datetime.date(2003, 9, 26)
125
126Next wednesday (it's today!).
127
128.. doctest:: relativedelta
129
130 >>> TODAY+relativedelta(weekday=WE(+1))
131 datetime.date(2003, 9, 17)
132
133Next wednesday, but not today.
134
135.. doctest:: relativedelta
136
137 >>> TODAY+relativedelta(days=+1, weekday=WE(+1))
138 datetime.date(2003, 9, 24)
139
140Following
141[http://www.cl.cam.ac.uk/~mgk25/iso-time.html ISO year week number notation]
142find the first day of the 15th week of 1997.
143
144.. doctest:: relativedelta
145
146 >>> datetime(1997,1,1)+relativedelta(day=4, weekday=MO(-1), weeks=+14)
147 datetime.datetime(1997, 4, 7, 0, 0)
148
149How long ago has the millennium changed?
150
151.. doctest:: relativedelta
Alex Willmer1cb362f2015-09-06 10:31:26 +0100152 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200153
154 >>> relativedelta(NOW, date(2001,1,1))
155 relativedelta(years=+2, months=+8, days=+16,
156 hours=+20, minutes=+54, seconds=+47, microseconds=+282310)
157
158How old is John?
159
160.. doctest:: relativedelta
Alex Willmer1cb362f2015-09-06 10:31:26 +0100161 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200162
163 >>> johnbirthday = datetime(1978, 4, 5, 12, 0)
164 >>> relativedelta(NOW, johnbirthday)
165 relativedelta(years=+25, months=+5, days=+12,
166 hours=+8, minutes=+54, seconds=+47, microseconds=+282310)
167
168It works with dates too.
169
170.. doctest:: relativedelta
171
172 >>> relativedelta(TODAY, johnbirthday)
173 relativedelta(years=+25, months=+5, days=+11, hours=+12)
174
175Obtain today's date using the yearday:
176
177.. doctest:: relativedelta
178
179 >>> date(2003, 1, 1)+relativedelta(yearday=260)
180 datetime.date(2003, 9, 17)
181
182We can use today's date, since yearday should be absolute
183in the given year:
184
185.. doctest:: relativedelta
186
187 >>> TODAY+relativedelta(yearday=260)
188 datetime.date(2003, 9, 17)
189
190Last year it should be in the same day:
191
192.. doctest:: relativedelta
193
194 >>> date(2002, 1, 1)+relativedelta(yearday=260)
195 datetime.date(2002, 9, 17)
196
197But not in a leap year:
198
199.. doctest:: relativedelta
200
201 >>> date(2000, 1, 1)+relativedelta(yearday=260)
202 datetime.date(2000, 9, 16)
203
204We can use the non-leap year day to ignore this:
205
206.. doctest:: relativedelta
207
208 >>> date(2000, 1, 1)+relativedelta(nlyearday=260)
209 datetime.date(2000, 9, 17)
210
211rrule examples
212--------------
213These examples were converted from the RFC.
214
215Prepare the environment.
216
217.. testsetup:: rrule
218
219 from dateutil.rrule import *
220 from dateutil.parser import *
221 from datetime import *
222 import pprint
223 import sys
224 sys.displayhook = pprint.pprint
225
226.. doctest:: rrule
227
228 >>> from dateutil.rrule import *
229 >>> from dateutil.parser import *
230 >>> from datetime import *
231
232 >>> import pprint
233 >>> import sys
234 >>> sys.displayhook = pprint.pprint
235
236Daily, for 10 occurrences.
237
238.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100239 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200240
241 >>> list(rrule(DAILY, count=10,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100242 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200243 [datetime.datetime(1997, 9, 2, 9, 0),
244 datetime.datetime(1997, 9, 3, 9, 0),
245 datetime.datetime(1997, 9, 4, 9, 0),
246 datetime.datetime(1997, 9, 5, 9, 0),
247 datetime.datetime(1997, 9, 6, 9, 0),
248 datetime.datetime(1997, 9, 7, 9, 0),
249 datetime.datetime(1997, 9, 8, 9, 0),
250 datetime.datetime(1997, 9, 9, 9, 0),
251 datetime.datetime(1997, 9, 10, 9, 0),
252 datetime.datetime(1997, 9, 11, 9, 0)]
253
254Daily until December 24, 1997
255
256.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100257 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200258
259 >>> list(rrule(DAILY,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100260 ... dtstart=parse("19970902T090000"),
261 ... until=parse("19971224T000000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200262 [datetime.datetime(1997, 9, 2, 9, 0),
263 datetime.datetime(1997, 9, 3, 9, 0),
264 datetime.datetime(1997, 9, 4, 9, 0),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100265 ...
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200266 datetime.datetime(1997, 12, 21, 9, 0),
267 datetime.datetime(1997, 12, 22, 9, 0),
268 datetime.datetime(1997, 12, 23, 9, 0)]
269
270Every other day, 5 occurrences.
271
272.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100273 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200274
275 >>> list(rrule(DAILY, interval=2, count=5,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100276 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200277 [datetime.datetime(1997, 9, 2, 9, 0),
278 datetime.datetime(1997, 9, 4, 9, 0),
279 datetime.datetime(1997, 9, 6, 9, 0),
280 datetime.datetime(1997, 9, 8, 9, 0),
281 datetime.datetime(1997, 9, 10, 9, 0)]
282
283Every 10 days, 5 occurrences.
284
285.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100286 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200287
288 >>> list(rrule(DAILY, interval=10, count=5,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100289 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200290 [datetime.datetime(1997, 9, 2, 9, 0),
291 datetime.datetime(1997, 9, 12, 9, 0),
292 datetime.datetime(1997, 9, 22, 9, 0),
293 datetime.datetime(1997, 10, 2, 9, 0),
294 datetime.datetime(1997, 10, 12, 9, 0)]
295
296Everyday in January, for 3 years.
297
298.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100299 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200300
301 >>> list(rrule(YEARLY, bymonth=1, byweekday=range(7),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100302 ... dtstart=parse("19980101T090000"),
303 ... until=parse("20000131T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200304 [datetime.datetime(1998, 1, 1, 9, 0),
305 datetime.datetime(1998, 1, 2, 9, 0),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100306 ...
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200307 datetime.datetime(1998, 1, 30, 9, 0),
308 datetime.datetime(1998, 1, 31, 9, 0),
309 datetime.datetime(1999, 1, 1, 9, 0),
310 datetime.datetime(1999, 1, 2, 9, 0),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100311 ...
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200312 datetime.datetime(1999, 1, 30, 9, 0),
313 datetime.datetime(1999, 1, 31, 9, 0),
314 datetime.datetime(2000, 1, 1, 9, 0),
315 datetime.datetime(2000, 1, 2, 9, 0),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100316 ...
Alex Willmer09611c52015-09-06 10:39:30 +0100317 datetime.datetime(2000, 1, 30, 9, 0),
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200318 datetime.datetime(2000, 1, 31, 9, 0)]
319
320Same thing, in another way.
321
322.. doctest:: rrule
323
324 >>> list(rrule(DAILY, bymonth=1,
325 dtstart=parse("19980101T090000"),
326 until=parse("20000131T090000")))
327 (...)
328
329Weekly for 10 occurrences.
330
331.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100332 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200333
334 >>> list(rrule(WEEKLY, count=10,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100335 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200336 [datetime.datetime(1997, 9, 2, 9, 0),
337 datetime.datetime(1997, 9, 9, 9, 0),
338 datetime.datetime(1997, 9, 16, 9, 0),
339 datetime.datetime(1997, 9, 23, 9, 0),
340 datetime.datetime(1997, 9, 30, 9, 0),
341 datetime.datetime(1997, 10, 7, 9, 0),
342 datetime.datetime(1997, 10, 14, 9, 0),
343 datetime.datetime(1997, 10, 21, 9, 0),
344 datetime.datetime(1997, 10, 28, 9, 0),
345 datetime.datetime(1997, 11, 4, 9, 0)]
346
347Every other week, 6 occurrences.
348
349.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100350 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200351
352 >>> list(rrule(WEEKLY, interval=2, count=6,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100353 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200354 [datetime.datetime(1997, 9, 2, 9, 0),
355 datetime.datetime(1997, 9, 16, 9, 0),
356 datetime.datetime(1997, 9, 30, 9, 0),
357 datetime.datetime(1997, 10, 14, 9, 0),
358 datetime.datetime(1997, 10, 28, 9, 0),
359 datetime.datetime(1997, 11, 11, 9, 0)]
360
361Weekly on Tuesday and Thursday for 5 weeks.
362
363.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100364 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200365
366 >>> list(rrule(WEEKLY, count=10, wkst=SU, byweekday=(TU,TH),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100367 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200368 [datetime.datetime(1997, 9, 2, 9, 0),
369 datetime.datetime(1997, 9, 4, 9, 0),
370 datetime.datetime(1997, 9, 9, 9, 0),
371 datetime.datetime(1997, 9, 11, 9, 0),
372 datetime.datetime(1997, 9, 16, 9, 0),
373 datetime.datetime(1997, 9, 18, 9, 0),
374 datetime.datetime(1997, 9, 23, 9, 0),
375 datetime.datetime(1997, 9, 25, 9, 0),
376 datetime.datetime(1997, 9, 30, 9, 0),
377 datetime.datetime(1997, 10, 2, 9, 0)]
378
379Every other week on Tuesday and Thursday, for 8 occurrences.
380
381.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100382 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200383
384 >>> list(rrule(WEEKLY, interval=2, count=8,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100385 ... wkst=SU, byweekday=(TU,TH),
386 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200387 [datetime.datetime(1997, 9, 2, 9, 0),
388 datetime.datetime(1997, 9, 4, 9, 0),
389 datetime.datetime(1997, 9, 16, 9, 0),
390 datetime.datetime(1997, 9, 18, 9, 0),
391 datetime.datetime(1997, 9, 30, 9, 0),
392 datetime.datetime(1997, 10, 2, 9, 0),
393 datetime.datetime(1997, 10, 14, 9, 0),
394 datetime.datetime(1997, 10, 16, 9, 0)]
395
396Monthly on the 1st Friday for ten occurrences.
397
398.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100399 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200400
401 >>> list(rrule(MONTHLY, count=10, byweekday=FR(1),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100402 ... dtstart=parse("19970905T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200403 [datetime.datetime(1997, 9, 5, 9, 0),
404 datetime.datetime(1997, 10, 3, 9, 0),
405 datetime.datetime(1997, 11, 7, 9, 0),
406 datetime.datetime(1997, 12, 5, 9, 0),
407 datetime.datetime(1998, 1, 2, 9, 0),
408 datetime.datetime(1998, 2, 6, 9, 0),
409 datetime.datetime(1998, 3, 6, 9, 0),
410 datetime.datetime(1998, 4, 3, 9, 0),
411 datetime.datetime(1998, 5, 1, 9, 0),
412 datetime.datetime(1998, 6, 5, 9, 0)]
413
414Every other month on the 1st and last Sunday of the month for 10 occurrences.
415
416.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100417 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200418
419 >>> list(rrule(MONTHLY, interval=2, count=10,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100420 ... byweekday=(SU(1), SU(-1)),
421 ... dtstart=parse("19970907T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200422 [datetime.datetime(1997, 9, 7, 9, 0),
423 datetime.datetime(1997, 9, 28, 9, 0),
424 datetime.datetime(1997, 11, 2, 9, 0),
425 datetime.datetime(1997, 11, 30, 9, 0),
426 datetime.datetime(1998, 1, 4, 9, 0),
427 datetime.datetime(1998, 1, 25, 9, 0),
428 datetime.datetime(1998, 3, 1, 9, 0),
429 datetime.datetime(1998, 3, 29, 9, 0),
430 datetime.datetime(1998, 5, 3, 9, 0),
431 datetime.datetime(1998, 5, 31, 9, 0)]
432
433Monthly on the second to last Monday of the month for 6 months.
434
435.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100436 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200437
438 >>> list(rrule(MONTHLY, count=6, byweekday=MO(-2),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100439 ... dtstart=parse("19970922T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200440 [datetime.datetime(1997, 9, 22, 9, 0),
441 datetime.datetime(1997, 10, 20, 9, 0),
442 datetime.datetime(1997, 11, 17, 9, 0),
443 datetime.datetime(1997, 12, 22, 9, 0),
444 datetime.datetime(1998, 1, 19, 9, 0),
445 datetime.datetime(1998, 2, 16, 9, 0)]
446
447
448Monthly on the third to the last day of the month, for 6 months.
449
450.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100451 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200452
453 >>> list(rrule(MONTHLY, count=6, bymonthday=-3,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100454 ... dtstart=parse("19970928T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200455 [datetime.datetime(1997, 9, 28, 9, 0),
456 datetime.datetime(1997, 10, 29, 9, 0),
457 datetime.datetime(1997, 11, 28, 9, 0),
458 datetime.datetime(1997, 12, 29, 9, 0),
459 datetime.datetime(1998, 1, 29, 9, 0),
460 datetime.datetime(1998, 2, 26, 9, 0)]
461
462
463Monthly on the 2nd and 15th of the month for 5 occurrences.
464
465.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100466 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200467
468 >>> list(rrule(MONTHLY, count=5, bymonthday=(2,15),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100469 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200470 [datetime.datetime(1997, 9, 2, 9, 0),
471 datetime.datetime(1997, 9, 15, 9, 0),
472 datetime.datetime(1997, 10, 2, 9, 0),
473 datetime.datetime(1997, 10, 15, 9, 0),
474 datetime.datetime(1997, 11, 2, 9, 0)]
475
476
477Monthly on the first and last day of the month for 3 occurrences.
478
479.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100480 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200481
482 >>> list(rrule(MONTHLY, count=5, bymonthday=(-1,1,),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100483 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200484 [datetime.datetime(1997, 9, 30, 9, 0),
485 datetime.datetime(1997, 10, 1, 9, 0),
486 datetime.datetime(1997, 10, 31, 9, 0),
487 datetime.datetime(1997, 11, 1, 9, 0),
488 datetime.datetime(1997, 11, 30, 9, 0)]
489
490
491Every 18 months on the 10th thru 15th of the month for 10 occurrences.
492
493.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100494 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200495
496 >>> list(rrule(MONTHLY, interval=18, count=10,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100497 ... bymonthday=range(10,16),
498 ... dtstart=parse("19970910T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200499 [datetime.datetime(1997, 9, 10, 9, 0),
500 datetime.datetime(1997, 9, 11, 9, 0),
501 datetime.datetime(1997, 9, 12, 9, 0),
502 datetime.datetime(1997, 9, 13, 9, 0),
503 datetime.datetime(1997, 9, 14, 9, 0),
504 datetime.datetime(1997, 9, 15, 9, 0),
505 datetime.datetime(1999, 3, 10, 9, 0),
506 datetime.datetime(1999, 3, 11, 9, 0),
507 datetime.datetime(1999, 3, 12, 9, 0),
508 datetime.datetime(1999, 3, 13, 9, 0)]
509
510
511Every Tuesday, every other month, 6 occurences.
512
513.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100514 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200515
516 >>> list(rrule(MONTHLY, interval=2, count=6, byweekday=TU,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100517 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200518 [datetime.datetime(1997, 9, 2, 9, 0),
519 datetime.datetime(1997, 9, 9, 9, 0),
520 datetime.datetime(1997, 9, 16, 9, 0),
521 datetime.datetime(1997, 9, 23, 9, 0),
522 datetime.datetime(1997, 9, 30, 9, 0),
523 datetime.datetime(1997, 11, 4, 9, 0)]
524
525
526Yearly in June and July for 10 occurrences.
527
528.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100529 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200530
531 >>> list(rrule(YEARLY, count=4, bymonth=(6,7),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100532 ... dtstart=parse("19970610T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200533 [datetime.datetime(1997, 6, 10, 9, 0),
534 datetime.datetime(1997, 7, 10, 9, 0),
535 datetime.datetime(1998, 6, 10, 9, 0),
536 datetime.datetime(1998, 7, 10, 9, 0)]
537
538
539Every 3rd year on the 1st, 100th and 200th day for 4 occurrences.
540
541.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100542 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200543
544 >>> list(rrule(YEARLY, count=4, interval=3, byyearday=(1,100,200),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100545 ... dtstart=parse("19970101T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200546 [datetime.datetime(1997, 1, 1, 9, 0),
547 datetime.datetime(1997, 4, 10, 9, 0),
548 datetime.datetime(1997, 7, 19, 9, 0),
549 datetime.datetime(2000, 1, 1, 9, 0)]
550
551
552Every 20th Monday of the year, 3 occurrences.
553
554.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100555 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200556
557 >>> list(rrule(YEARLY, count=3, byweekday=MO(20),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100558 ... dtstart=parse("19970519T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200559 [datetime.datetime(1997, 5, 19, 9, 0),
560 datetime.datetime(1998, 5, 18, 9, 0),
561 datetime.datetime(1999, 5, 17, 9, 0)]
562
563
564Monday of week number 20 (where the default start of the week is Monday),
5653 occurrences.
566
567.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100568 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200569
570 >>> list(rrule(YEARLY, count=3, byweekno=20, byweekday=MO,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100571 ... dtstart=parse("19970512T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200572 [datetime.datetime(1997, 5, 12, 9, 0),
573 datetime.datetime(1998, 5, 11, 9, 0),
574 datetime.datetime(1999, 5, 17, 9, 0)]
575
576
577The week number 1 may be in the last year.
578
579.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100580 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200581
582 >>> list(rrule(WEEKLY, count=3, byweekno=1, byweekday=MO,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100583 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200584 [datetime.datetime(1997, 12, 29, 9, 0),
585 datetime.datetime(1999, 1, 4, 9, 0),
586 datetime.datetime(2000, 1, 3, 9, 0)]
587
588
589And the week numbers greater than 51 may be in the next year.
590
591.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100592 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200593
594 >>> list(rrule(WEEKLY, count=3, byweekno=52, byweekday=SU,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100595 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200596 [datetime.datetime(1997, 12, 28, 9, 0),
597 datetime.datetime(1998, 12, 27, 9, 0),
598 datetime.datetime(2000, 1, 2, 9, 0)]
599
600
601Only some years have week number 53:
602
603.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100604 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200605
606 >>> list(rrule(WEEKLY, count=3, byweekno=53, byweekday=MO,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100607 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200608 [datetime.datetime(1998, 12, 28, 9, 0),
609 datetime.datetime(2004, 12, 27, 9, 0),
610 datetime.datetime(2009, 12, 28, 9, 0)]
611
612
613Every Friday the 13th, 4 occurrences.
614
615.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100616 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200617
618 >>> list(rrule(YEARLY, count=4, byweekday=FR, bymonthday=13,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100619 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200620 [datetime.datetime(1998, 2, 13, 9, 0),
621 datetime.datetime(1998, 3, 13, 9, 0),
622 datetime.datetime(1998, 11, 13, 9, 0),
623 datetime.datetime(1999, 8, 13, 9, 0)]
624
625
626Every four years, the first Tuesday after a Monday in November,
6273 occurrences (U.S. Presidential Election day):
628
629.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100630 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200631
632 >>> list(rrule(YEARLY, interval=4, count=3, bymonth=11,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100633 ... byweekday=TU, bymonthday=(2,3,4,5,6,7,8),
634 ... dtstart=parse("19961105T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200635 [datetime.datetime(1996, 11, 5, 9, 0),
636 datetime.datetime(2000, 11, 7, 9, 0),
637 datetime.datetime(2004, 11, 2, 9, 0)]
638
639
640The 3rd instance into the month of one of Tuesday, Wednesday or
641Thursday, for the next 3 months:
642
643.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100644 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200645
646 >>> list(rrule(MONTHLY, count=3, byweekday=(TU,WE,TH),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100647 ... bysetpos=3, dtstart=parse("19970904T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200648 [datetime.datetime(1997, 9, 4, 9, 0),
649 datetime.datetime(1997, 10, 7, 9, 0),
650 datetime.datetime(1997, 11, 6, 9, 0)]
651
652
653The 2nd to last weekday of the month, 3 occurrences.
654
655.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100656 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200657
658 >>> list(rrule(MONTHLY, count=3, byweekday=(MO,TU,WE,TH,FR),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100659 ... bysetpos=-2, dtstart=parse("19970929T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200660 [datetime.datetime(1997, 9, 29, 9, 0),
661 datetime.datetime(1997, 10, 30, 9, 0),
662 datetime.datetime(1997, 11, 27, 9, 0)]
663
664
665Every 3 hours from 9:00 AM to 5:00 PM on a specific day.
666
667.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100668 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200669
670 >>> list(rrule(HOURLY, interval=3,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100671 ... dtstart=parse("19970902T090000"),
672 ... until=parse("19970902T170000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200673 [datetime.datetime(1997, 9, 2, 9, 0),
674 datetime.datetime(1997, 9, 2, 12, 0),
675 datetime.datetime(1997, 9, 2, 15, 0)]
676
677
678Every 15 minutes for 6 occurrences.
679
680.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100681 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200682
683 >>> list(rrule(MINUTELY, interval=15, count=6,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100684 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200685 [datetime.datetime(1997, 9, 2, 9, 0),
686 datetime.datetime(1997, 9, 2, 9, 15),
687 datetime.datetime(1997, 9, 2, 9, 30),
688 datetime.datetime(1997, 9, 2, 9, 45),
689 datetime.datetime(1997, 9, 2, 10, 0),
690 datetime.datetime(1997, 9, 2, 10, 15)]
691
692
693Every hour and a half for 4 occurrences.
694
695.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100696 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200697
698 >>> list(rrule(MINUTELY, interval=90, count=4,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100699 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200700 [datetime.datetime(1997, 9, 2, 9, 0),
701 datetime.datetime(1997, 9, 2, 10, 30),
702 datetime.datetime(1997, 9, 2, 12, 0),
703 datetime.datetime(1997, 9, 2, 13, 30)]
704
705
706Every 20 minutes from 9:00 AM to 4:40 PM for two days.
707
708.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100709 :options: +NORMALIZE_WHITESPACE, +ELLIPSIS
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200710
711 >>> list(rrule(MINUTELY, interval=20, count=48,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100712 ... byhour=range(9,17), byminute=(0,20,40),
713 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200714 [datetime.datetime(1997, 9, 2, 9, 0),
715 datetime.datetime(1997, 9, 2, 9, 20),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100716 ...
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200717 datetime.datetime(1997, 9, 2, 16, 20),
718 datetime.datetime(1997, 9, 2, 16, 40),
719 datetime.datetime(1997, 9, 3, 9, 0),
720 datetime.datetime(1997, 9, 3, 9, 20),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100721 ...
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200722 datetime.datetime(1997, 9, 3, 16, 20),
723 datetime.datetime(1997, 9, 3, 16, 40)]
724
725
726An example where the days generated makes a difference because of `wkst`.
727
728.. doctest:: rrule
Alex Willmer1cb362f2015-09-06 10:31:26 +0100729 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200730
731 >>> list(rrule(WEEKLY, interval=2, count=4,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100732 ... byweekday=(TU,SU), wkst=MO,
733 ... dtstart=parse("19970805T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200734 [datetime.datetime(1997, 8, 5, 9, 0),
735 datetime.datetime(1997, 8, 10, 9, 0),
736 datetime.datetime(1997, 8, 19, 9, 0),
737 datetime.datetime(1997, 8, 24, 9, 0)]
738
739 >>> list(rrule(WEEKLY, interval=2, count=4,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100740 ... byweekday=(TU,SU), wkst=SU,
741 ... dtstart=parse("19970805T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200742 [datetime.datetime(1997, 8, 5, 9, 0),
743 datetime.datetime(1997, 8, 17, 9, 0),
744 datetime.datetime(1997, 8, 19, 9, 0),
745 datetime.datetime(1997, 8, 31, 9, 0)]
746
747
748rruleset examples
749-----------------
750Daily, for 7 days, jumping Saturday and Sunday occurrences.
751
Alex Willmeraaee35c2015-09-06 10:35:07 +0100752.. testsetup:: rruleset
753
754 import datetime
755
756 from dateutil.parser import parse
757 from dateutil.rrule import rrule, rruleset
758 from dateutil.rrule import YEARLY, MONTHLY, WEEKLY, DAILY
759 from dateutil.rrule import MO, TU, WE, TH, FR, SA, SU
760
761 import pprint
762 import sys
763 sys.displayhook = pprint.pprint
764
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200765.. doctest:: rruleset
Alex Willmer1cb362f2015-09-06 10:31:26 +0100766 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200767
768 >>> set = rruleset()
769 >>> set.rrule(rrule(DAILY, count=7,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100770 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200771 >>> set.exrule(rrule(YEARLY, byweekday=(SA,SU),
Alex Willmer1cb362f2015-09-06 10:31:26 +0100772 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200773 >>> list(set)
774 [datetime.datetime(1997, 9, 2, 9, 0),
775 datetime.datetime(1997, 9, 3, 9, 0),
776 datetime.datetime(1997, 9, 4, 9, 0),
777 datetime.datetime(1997, 9, 5, 9, 0),
778 datetime.datetime(1997, 9, 8, 9, 0)]
779
780
781Weekly, for 4 weeks, plus one time on day 7, and not on day 16.
782
783.. doctest:: rruleset
Alex Willmer1cb362f2015-09-06 10:31:26 +0100784 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200785
786 >>> set = rruleset()
787 >>> set.rrule(rrule(WEEKLY, count=4,
Alex Willmer1cb362f2015-09-06 10:31:26 +0100788 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200789 >>> set.rdate(datetime.datetime(1997, 9, 7, 9, 0))
790 >>> set.exdate(datetime.datetime(1997, 9, 16, 9, 0))
791 >>> list(set)
792 [datetime.datetime(1997, 9, 2, 9, 0),
793 datetime.datetime(1997, 9, 7, 9, 0),
794 datetime.datetime(1997, 9, 9, 9, 0),
795 datetime.datetime(1997, 9, 23, 9, 0)]
796
797
798rrulestr() examples
799-------------------
800
801Every 10 days, 5 occurrences.
802
Alex Willmeraaee35c2015-09-06 10:35:07 +0100803.. testsetup:: rrulestr
804
805 from dateutil.parser import parse
806 from dateutil.rrule import rruleset, rrulestr
807
808 import pprint
809 import sys
810 sys.displayhook = pprint.pprint
811
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200812.. doctest:: rrulestr
Alex Willmer1cb362f2015-09-06 10:31:26 +0100813 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200814
815 >>> list(rrulestr("""
816 ... DTSTART:19970902T090000
817 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
818 ... """))
819 [datetime.datetime(1997, 9, 2, 9, 0),
820 datetime.datetime(1997, 9, 12, 9, 0),
821 datetime.datetime(1997, 9, 22, 9, 0),
822 datetime.datetime(1997, 10, 2, 9, 0),
823 datetime.datetime(1997, 10, 12, 9, 0)]
824
825
826Same thing, but passing only the `RRULE` value.
827
828.. doctest:: rrulestr
Alex Willmer1cb362f2015-09-06 10:31:26 +0100829 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200830
831 >>> list(rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5",
Alex Willmer1cb362f2015-09-06 10:31:26 +0100832 ... dtstart=parse("19970902T090000")))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200833 [datetime.datetime(1997, 9, 2, 9, 0),
834 datetime.datetime(1997, 9, 12, 9, 0),
835 datetime.datetime(1997, 9, 22, 9, 0),
836 datetime.datetime(1997, 10, 2, 9, 0),
837 datetime.datetime(1997, 10, 12, 9, 0)]
838
839
840Notice that when using a single rule, it returns an
841`rrule` instance, unless `forceset` was used.
842
843.. doctest:: rrulestr
Alex Willmer1cb362f2015-09-06 10:31:26 +0100844 :options: +ELLIPSIS
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200845
846 >>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5")
Alex Willmer1cb362f2015-09-06 10:31:26 +0100847 <dateutil.rrule.rrule object at 0x...>
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200848
849 >>> rrulestr("""
850 ... DTSTART:19970902T090000
851 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
852 ... """)
Alex Willmer1cb362f2015-09-06 10:31:26 +0100853 <dateutil.rrule.rrule object at 0x...>
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200854
855 >>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5", forceset=True)
Alex Willmer1cb362f2015-09-06 10:31:26 +0100856 <dateutil.rrule.rruleset object at 0x...>
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200857
858
859But when an `rruleset` is needed, it is automatically used.
860
861.. doctest:: rrulestr
Alex Willmer1cb362f2015-09-06 10:31:26 +0100862 :options: +ELLIPSIS
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200863
864 >>> rrulestr("""
865 ... DTSTART:19970902T090000
866 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
867 ... RRULE:FREQ=DAILY;INTERVAL=5;COUNT=3
868 ... """)
Alex Willmer1cb362f2015-09-06 10:31:26 +0100869 <dateutil.rrule.rruleset object at 0x...>
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200870
871
872parse examples
873-----------
874The following code will prepare the environment:
875
876.. doctest:: tz
877
878 >>> from dateutil.parser import *
879 >>> from dateutil.tz import *
880 >>> from datetime import *
881 >>> TZOFFSETS = {"BRST": -10800}
Alex Willmer09611c52015-09-06 10:39:30 +0100882 >>> BRSTTZ = tzoffset("BRST", -10800)
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200883 >>> DEFAULT = datetime(2003, 9, 25)
884
885
886Some simple examples based on the `date` command, using the
887`ZOFFSET` dictionary to provide the BRST timezone offset.
888
889.. doctest:: tz
Alex Willmer1cb362f2015-09-06 10:31:26 +0100890 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200891
892 >>> parse("Thu Sep 25 10:36:28 BRST 2003", tzinfos=TZOFFSETS)
893 datetime.datetime(2003, 9, 25, 10, 36, 28,
894 tzinfo=tzoffset('BRST', -10800))
895
896 >>> parse("2003 10:36:28 BRST 25 Sep Thu", tzinfos=TZOFFSETS)
897 datetime.datetime(2003, 9, 25, 10, 36, 28,
898 tzinfo=tzoffset('BRST', -10800))
899
900
901Notice that since BRST is my local timezone, parsing it without
902further timezone settings will yield a `tzlocal` timezone.
903
904.. doctest:: tz
905
906 >>> parse("Thu Sep 25 10:36:28 BRST 2003")
907 datetime.datetime(2003, 9, 25, 10, 36, 28, tzinfo=tzlocal())
908
909
910We can also ask to ignore the timezone explicitly:
911
912.. doctest:: tz
913
914 >>> parse("Thu Sep 25 10:36:28 BRST 2003", ignoretz=True)
915 datetime.datetime(2003, 9, 25, 10, 36, 28)
916
917
918That's the same as processing a string without timezone:
919
920.. doctest:: tz
921
922 >>> parse("Thu Sep 25 10:36:28 2003")
923 datetime.datetime(2003, 9, 25, 10, 36, 28)
924
925
926Without the year, but passing our `DEFAULT` datetime to return
927the same year, no mattering what year we currently are in:
928
929.. doctest:: tz
930
931 >>> parse("Thu Sep 25 10:36:28", default=DEFAULT)
932 datetime.datetime(2003, 9, 25, 10, 36, 28)
933
934
935Strip it further:
936
937.. doctest:: tz
938
939 >>> parse("Thu Sep 10:36:28", default=DEFAULT)
940 datetime.datetime(2003, 9, 25, 10, 36, 28)
941
942 >>> parse("Thu 10:36:28", default=DEFAULT)
943 datetime.datetime(2003, 9, 25, 10, 36, 28)
944
945 >>> parse("Thu 10:36", default=DEFAULT)
946 datetime.datetime(2003, 9, 25, 10, 36)
947
948 >>> parse("10:36", default=DEFAULT)
949 datetime.datetime(2003, 9, 25, 10, 36)
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200950
951
952Strip in a different way:
953
954.. doctest:: tz
955
956 >>> parse("Thu Sep 25 2003")
957 datetime.datetime(2003, 9, 25, 0, 0)
958
959 >>> parse("Sep 25 2003")
960 datetime.datetime(2003, 9, 25, 0, 0)
961
962 >>> parse("Sep 2003", default=DEFAULT)
963 datetime.datetime(2003, 9, 25, 0, 0)
964
965 >>> parse("Sep", default=DEFAULT)
966 datetime.datetime(2003, 9, 25, 0, 0)
967
968 >>> parse("2003", default=DEFAULT)
969 datetime.datetime(2003, 9, 25, 0, 0)
970
971
972Another format, based on `date -R` (RFC822):
973
974.. doctest:: tz
Alex Willmer1cb362f2015-09-06 10:31:26 +0100975 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200976
977 >>> parse("Thu, 25 Sep 2003 10:49:41 -0300")
978 datetime.datetime(2003, 9, 25, 10, 49, 41,
979 tzinfo=tzoffset(None, -10800))
980
981
982ISO format:
983
984.. doctest:: tz
Alex Willmer1cb362f2015-09-06 10:31:26 +0100985 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +0200986
987 >>> parse("2003-09-25T10:49:41.5-03:00")
988 datetime.datetime(2003, 9, 25, 10, 49, 41, 500000,
989 tzinfo=tzoffset(None, -10800))
990
991
992Some variations:
993
994.. doctest:: tz
995
996 >>> parse("2003-09-25T10:49:41")
997 datetime.datetime(2003, 9, 25, 10, 49, 41)
998
999 >>> parse("2003-09-25T10:49")
1000 datetime.datetime(2003, 9, 25, 10, 49)
1001
1002 >>> parse("2003-09-25T10")
1003 datetime.datetime(2003, 9, 25, 10, 0)
1004
1005 >>> parse("2003-09-25")
1006 datetime.datetime(2003, 9, 25, 0, 0)
1007
1008
1009ISO format, without separators:
1010
1011.. doctest:: tz
Alex Willmer1cb362f2015-09-06 10:31:26 +01001012 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001013
1014 >>> parse("20030925T104941.5-0300")
1015 datetime.datetime(2003, 9, 25, 10, 49, 41, 500000,
Alex Willmer09611c52015-09-06 10:39:30 +01001016 tzinfo=tzoffset(None, -10800))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001017
1018 >>> parse("20030925T104941-0300")
1019 datetime.datetime(2003, 9, 25, 10, 49, 41,
1020 tzinfo=tzoffset(None, -10800))
1021
1022 >>> parse("20030925T104941")
1023 datetime.datetime(2003, 9, 25, 10, 49, 41)
1024
1025 >>> parse("20030925T1049")
1026 datetime.datetime(2003, 9, 25, 10, 49)
1027
1028 >>> parse("20030925T10")
1029 datetime.datetime(2003, 9, 25, 10, 0)
1030
1031 >>> parse("20030925")
1032 datetime.datetime(2003, 9, 25, 0, 0)
1033
1034
1035Everything together.
1036
1037.. doctest:: tz
1038
1039 >>> parse("199709020900")
1040 datetime.datetime(1997, 9, 2, 9, 0)
1041 >>> parse("19970902090059")
1042 datetime.datetime(1997, 9, 2, 9, 0, 59)
1043
1044
1045Different date orderings:
1046
1047.. doctest:: tz
1048
1049 >>> parse("2003-09-25")
1050 datetime.datetime(2003, 9, 25, 0, 0)
1051
1052 >>> parse("2003-Sep-25")
1053 datetime.datetime(2003, 9, 25, 0, 0)
1054
1055 >>> parse("25-Sep-2003")
1056 datetime.datetime(2003, 9, 25, 0, 0)
1057
1058 >>> parse("Sep-25-2003")
1059 datetime.datetime(2003, 9, 25, 0, 0)
1060
1061 >>> parse("09-25-2003")
1062 datetime.datetime(2003, 9, 25, 0, 0)
1063
1064 >>> parse("25-09-2003")
1065 datetime.datetime(2003, 9, 25, 0, 0)
1066
1067
1068Check some ambiguous dates:
1069
1070.. doctest:: tz
1071
1072 >>> parse("10-09-2003")
1073 datetime.datetime(2003, 10, 9, 0, 0)
1074
1075 >>> parse("10-09-2003", dayfirst=True)
1076 datetime.datetime(2003, 9, 10, 0, 0)
1077
1078 >>> parse("10-09-03")
1079 datetime.datetime(2003, 10, 9, 0, 0)
1080
1081 >>> parse("10-09-03", yearfirst=True)
1082 datetime.datetime(2010, 9, 3, 0, 0)
1083
1084
1085Other date separators are allowed:
1086
1087.. doctest:: tz
1088
1089 >>> parse("2003.Sep.25")
1090 datetime.datetime(2003, 9, 25, 0, 0)
1091
1092 >>> parse("2003/09/25")
1093 datetime.datetime(2003, 9, 25, 0, 0)
1094
1095
1096Even with spaces:
1097
1098.. doctest:: tz
1099
1100 >>> parse("2003 Sep 25")
1101 datetime.datetime(2003, 9, 25, 0, 0)
1102
1103 >>> parse("2003 09 25")
1104 datetime.datetime(2003, 9, 25, 0, 0)
1105
1106
1107Hours with letters work:
1108
1109.. doctest:: tz
1110
1111 >>> parse("10h36m28.5s", default=DEFAULT)
1112 datetime.datetime(2003, 9, 25, 10, 36, 28, 500000)
1113
1114 >>> parse("01s02h03m", default=DEFAULT)
1115 datetime.datetime(2003, 9, 25, 2, 3, 1)
1116
1117 >>> parse("01h02m03", default=DEFAULT)
1118 datetime.datetime(2003, 9, 3, 1, 2)
1119
1120 >>> parse("01h02", default=DEFAULT)
1121 datetime.datetime(2003, 9, 2, 1, 0)
1122
1123 >>> parse("01h02s", default=DEFAULT)
1124 datetime.datetime(2003, 9, 25, 1, 0, 2)
1125
1126
1127With AM/PM:
1128
1129.. doctest:: tz
1130
1131 >>> parse("10h am", default=DEFAULT)
1132 datetime.datetime(2003, 9, 25, 10, 0)
1133
1134 >>> parse("10pm", default=DEFAULT)
1135 datetime.datetime(2003, 9, 25, 22, 0)
1136
1137 >>> parse("12:00am", default=DEFAULT)
1138 datetime.datetime(2003, 9, 25, 0, 0)
1139
1140 >>> parse("12pm", default=DEFAULT)
1141 datetime.datetime(2003, 9, 25, 12, 0)
1142
1143
1144Some special treating for ''pertain'' relations:
1145
1146.. doctest:: tz
1147
1148 >>> parse("Sep 03", default=DEFAULT)
1149 datetime.datetime(2003, 9, 3, 0, 0)
1150
1151 >>> parse("Sep of 03", default=DEFAULT)
1152 datetime.datetime(2003, 9, 25, 0, 0)
1153
1154
1155Fuzzy parsing:
1156
1157.. doctest:: tz
Alex Willmer1cb362f2015-09-06 10:31:26 +01001158 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001159
1160 >>> s = "Today is 25 of September of 2003, exactly " \
1161 ... "at 10:49:41 with timezone -03:00."
1162 >>> parse(s, fuzzy=True)
1163 datetime.datetime(2003, 9, 25, 10, 49, 41,
1164 tzinfo=tzoffset(None, -10800))
1165
1166
1167Other random formats:
1168
1169.. doctest:: tz
1170
1171 >>> parse("Wed, July 10, '96")
1172 datetime.datetime(1996, 7, 10, 0, 0)
1173
1174 >>> parse("1996.07.10 AD at 15:08:56 PDT", ignoretz=True)
1175 datetime.datetime(1996, 7, 10, 15, 8, 56)
1176
1177 >>> parse("Tuesday, April 12, 1952 AD 3:30:42pm PST", ignoretz=True)
1178 datetime.datetime(1952, 4, 12, 15, 30, 42)
1179
1180 >>> parse("November 5, 1994, 8:15:30 am EST", ignoretz=True)
1181 datetime.datetime(1994, 11, 5, 8, 15, 30)
1182
1183 >>> parse("3rd of May 2001")
1184 datetime.datetime(2001, 5, 3, 0, 0)
1185
1186 >>> parse("5:50 A.M. on June 13, 1990")
1187 datetime.datetime(1990, 6, 13, 5, 50)
1188
1189
1190tzutc examples
1191--------------
1192
1193.. doctest:: tzutc
1194
1195 >>> from datetime import *
1196 >>> from dateutil.tz import *
1197
1198 >>> datetime.now()
1199 datetime.datetime(2003, 9, 27, 9, 40, 1, 521290)
1200
1201 >>> datetime.now(tzutc())
1202 datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc())
1203
1204 >>> datetime.now(tzutc()).tzname()
1205 'UTC'
1206
1207
1208tzoffset examples
1209-----------------
1210
1211.. doctest:: tzoffset
Alex Willmer1cb362f2015-09-06 10:31:26 +01001212 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001213
1214 >>> from datetime import *
1215 >>> from dateutil.tz import *
1216
1217 >>> datetime.now(tzoffset("BRST", -10800))
1218 datetime.datetime(2003, 9, 27, 9, 52, 43, 624904,
1219 tzinfo=tzinfo=tzoffset('BRST', -10800))
1220
1221 >>> datetime.now(tzoffset("BRST", -10800)).tzname()
1222 'BRST'
1223
1224 >>> datetime.now(tzoffset("BRST", -10800)).astimezone(tzutc())
1225 datetime.datetime(2003, 9, 27, 12, 53, 11, 446419,
1226 tzinfo=tzutc())
1227
1228
1229tzlocal examples
1230----------------
1231
1232.. doctest:: tzlocal
1233
1234 >>> from datetime import *
1235 >>> from dateutil.tz import *
1236
1237 >>> datetime.now(tzlocal())
1238 datetime.datetime(2003, 9, 27, 10, 1, 43, 673605,
1239 tzinfo=tzlocal())
1240
1241 >>> datetime.now(tzlocal()).tzname()
1242 'BRST'
1243
1244 >>> datetime.now(tzlocal()).astimezone(tzoffset(None, 0))
1245 datetime.datetime(2003, 9, 27, 13, 3, 0, 11493,
1246 tzinfo=tzoffset(None, 0))
1247
1248
1249tzstr examples
1250--------------
1251Here are examples of the recognized formats:
1252
1253 * `EST5EDT`
1254 * `EST5EDT,4,0,6,7200,10,0,26,7200,3600`
1255 * `EST5EDT,4,1,0,7200,10,-1,0,7200,3600`
1256 * `EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00`
1257 * `EST5EDT4,95/02:00:00,298/02:00`
1258 * `EST5EDT4,J96/02:00:00,J299/02:00`
1259
1260Notice that if daylight information is not present, but a
1261daylight abbreviation was provided, `tzstr` will follow the
1262convention of using the first sunday of April to start daylight
1263saving, and the last sunday of October to end it. If start or
1264end time is not present, 2AM will be used, and if the daylight
1265offset is not present, the standard offset plus one hour will
1266be used. This convention is the same as used in the GNU libc.
1267
1268This also means that some of the above examples are exactly
1269equivalent, and all of these examples are equivalent
1270in the year of 2003.
1271
1272Here is the example mentioned in the
1273
1274[http://www.python.org/doc/current/lib/module-time.html time module documentation].
1275
Alex Willmeraaee35c2015-09-06 10:35:07 +01001276.. testsetup:: tzstr
1277
1278 import os
1279 import time
1280 from datetime import datetime
1281 from dateutil.tz import tzstr
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001282
1283.. doctest:: tzstr
1284
1285 >>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'
1286 >>> time.tzset()
1287 >>> time.strftime('%X %x %Z')
1288 '02:07:36 05/08/03 EDT'
1289 >>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
1290 >>> time.tzset()
1291 >>> time.strftime('%X %x %Z')
1292 '16:08:12 05/08/03 AEST'
1293
1294
1295And here is an example showing the same information using `tzstr`,
1296without touching system settings.
1297
1298.. doctest:: tzstr
1299
1300 >>> tz1 = tzstr('EST+05EDT,M4.1.0,M10.5.0')
1301 >>> tz2 = tzstr('AEST-10AEDT-11,M10.5.0,M3.5.0')
1302 >>> dt = datetime(2003, 5, 8, 2, 7, 36, tzinfo=tz1)
1303 >>> dt.strftime('%X %x %Z')
1304 '02:07:36 05/08/03 EDT'
1305 >>> dt.astimezone(tz2).strftime('%X %x %Z')
1306 '16:07:36 05/08/03 AEST'
1307
1308
1309Are these really equivalent?
1310
1311.. doctest:: tzstr
1312
1313 >>> tzstr('EST5EDT') == tzstr('EST5EDT,4,1,0,7200,10,-1,0,7200,3600')
1314 True
1315
1316
1317Check the daylight limit.
1318
1319.. doctest:: tzstr
1320
Alex Willmer09611c52015-09-06 10:39:30 +01001321 >>> tz = tzstr('EST+05EDT,M4.1.0,M10.5.0')
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001322 >>> datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname()
1323 'EST'
1324 >>> datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname()
1325 'EDT'
1326 >>> datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname()
1327 'EDT'
1328 >>> datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname()
1329 'EST'
1330
1331
1332tzrange examples
1333----------------
1334
Alex Willmeraaee35c2015-09-06 10:35:07 +01001335.. testsetup:: tzrange
1336
1337 from dateutil.tz import tzrange, tzstr
1338
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001339.. doctest:: tzrange
1340
1341 >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT")
1342 True
1343
1344 >>> from dateutil.relativedelta import *
1345 >>> range1 = tzrange("EST", -18000, "EDT")
1346 >>> range2 = tzrange("EST", -18000, "EDT", -14400,
1347 ... relativedelta(hours=+2, month=4, day=1,
Alex Willmer1cb362f2015-09-06 10:31:26 +01001348 ... weekday=SU(+1)),
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001349 ... relativedelta(hours=+1, month=10, day=31,
Alex Willmer1cb362f2015-09-06 10:31:26 +01001350 ... weekday=SU(-1)))
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001351 >>> tzstr('EST5EDT') == range1 == range2
1352 True
1353
1354
1355Notice a minor detail in the last example: while the DST should end
1356at 2AM, the delta will catch 1AM. That's because the daylight saving
1357time should end at 2AM standard time (the difference between STD and
1358DST is 1h in the given example) instead of the DST time. That's how
1359the `tzinfo` subtypes should deal with the extra hour that happens
1360when going back to the standard time. Check
1361
1362[http://www.python.org/doc/current/lib/datetime-tzinfo.html tzinfo documentation]
1363
1364for more information.
1365
1366tzfile examples
1367---------------
1368
Alex Willmeraaee35c2015-09-06 10:35:07 +01001369.. testsetup:: tzfile
1370
1371 from datetime import datetime
1372 from dateutil.tz import tzfile, tzutc
1373
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001374.. doctest:: tzfile
Alex Willmer1cb362f2015-09-06 10:31:26 +01001375 :options: +NORMALIZE_WHITESPACE
Yaron de Leeuwdb52fc82014-11-29 18:04:03 +02001376
1377 >>> tz = tzfile("/etc/localtime")
1378 >>> datetime.now(tz)
1379 datetime.datetime(2003, 9, 27, 12, 3, 48, 392138,
1380 tzinfo=tzfile('/etc/localtime'))
1381
1382 >>> datetime.now(tz).astimezone(tzutc())
1383 datetime.datetime(2003, 9, 27, 15, 3, 53, 70863,
1384 tzinfo=tzutc())
1385
1386 >>> datetime.now(tz).tzname()
1387 'BRST'
1388 >>> datetime(2003, 1, 1, tzinfo=tz).tzname()
1389 'BRDT'
1390
1391
1392Check the daylight limit.
1393
1394.. doctest:: tzfile
1395
1396 >>> tz = tzfile('/usr/share/zoneinfo/EST5EDT')
1397 >>> datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname()
1398 'EST'
1399 >>> datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname()
1400 'EDT'
1401 >>> datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname()
1402 'EDT'
1403 >>> datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname()
1404 'EST'
1405
1406
1407tzical examples
1408---------------
1409Here is a sample file extracted from the RFC. This file defines
1410the `EST5EDT` timezone, and will be used in the following example.
1411
1412 BEGIN:VTIMEZONE
1413 TZID:US-Eastern
1414 LAST-MODIFIED:19870101T000000Z
1415 TZURL:http://zones.stds_r_us.net/tz/US-Eastern
1416 BEGIN:STANDARD
1417 DTSTART:19671029T020000
1418 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
1419 TZOFFSETFROM:-0400
1420 TZOFFSETTO:-0500
1421 TZNAME:EST
1422 END:STANDARD
1423 BEGIN:DAYLIGHT
1424 DTSTART:19870405T020000
1425 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
1426 TZOFFSETFROM:-0500
1427 TZOFFSETTO:-0400
1428 TZNAME:EDT
1429 END:DAYLIGHT
1430 END:VTIMEZONE
1431
1432And here is an example exploring a `tzical` type:
1433
1434.. doctest:: tzfile
1435
1436 >>> from dateutil.tz import *; from datetime import *
1437
1438 >>> tz = tzical('EST5EDT.ics')
1439 >>> tz.keys()
1440 ['US-Eastern']
1441
1442 >>> est = tz.get('US-Eastern')
1443 >>> est
1444 <tzicalvtz 'US-Eastern'>
1445
1446 >>> datetime.now(est)
1447 datetime.datetime(2003, 10, 6, 19, 44, 18, 667987,
1448 tzinfo=<tzicalvtz 'US-Eastern'>)
1449
1450 >>> est == tz.get()
1451 True
1452
1453
1454Let's check the daylight ranges, as usual:
1455
1456.. doctest:: tzfile
1457
1458 >>> datetime(2003, 4, 6, 1, 59, tzinfo=est).tzname()
1459 'EST'
1460 >>> datetime(2003, 4, 6, 2, 00, tzinfo=est).tzname()
1461 'EDT'
1462
1463 >>> datetime(2003, 10, 26, 0, 59, tzinfo=est).tzname()
1464 'EDT'
1465 >>> datetime(2003, 10, 26, 1, 00, tzinfo=est).tzname()
1466 'EST'
1467
1468
1469tzwin examples
1470--------------
1471
1472.. doctest:: tzwin
1473
1474 >>> tz = tzwin("E. South America Standard Time")
1475
1476
1477tzwinlocal examples
1478-------------------
1479
1480
1481.. doctest:: tzwinlocal
1482
1483 >>> tz = tzwinlocal()
1484
1485# vim:ts=4:sw=4:et