blob: ce52c63df46a5ee7a8ac020f20fe25bcc03add9f [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)
58 datetime(1, 1, 17, 20, 54, 47, 282310)
59
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
152
153 >>> relativedelta(NOW, date(2001,1,1))
154 relativedelta(years=+2, months=+8, days=+16,
155 hours=+20, minutes=+54, seconds=+47, microseconds=+282310)
156
157How old is John?
158
159.. doctest:: relativedelta
160
161 >>> johnbirthday = datetime(1978, 4, 5, 12, 0)
162 >>> relativedelta(NOW, johnbirthday)
163 relativedelta(years=+25, months=+5, days=+12,
164 hours=+8, minutes=+54, seconds=+47, microseconds=+282310)
165
166It works with dates too.
167
168.. doctest:: relativedelta
169
170 >>> relativedelta(TODAY, johnbirthday)
171 relativedelta(years=+25, months=+5, days=+11, hours=+12)
172
173Obtain today's date using the yearday:
174
175.. doctest:: relativedelta
176
177 >>> date(2003, 1, 1)+relativedelta(yearday=260)
178 datetime.date(2003, 9, 17)
179
180We can use today's date, since yearday should be absolute
181in the given year:
182
183.. doctest:: relativedelta
184
185 >>> TODAY+relativedelta(yearday=260)
186 datetime.date(2003, 9, 17)
187
188Last year it should be in the same day:
189
190.. doctest:: relativedelta
191
192 >>> date(2002, 1, 1)+relativedelta(yearday=260)
193 datetime.date(2002, 9, 17)
194
195But not in a leap year:
196
197.. doctest:: relativedelta
198
199 >>> date(2000, 1, 1)+relativedelta(yearday=260)
200 datetime.date(2000, 9, 16)
201
202We can use the non-leap year day to ignore this:
203
204.. doctest:: relativedelta
205
206 >>> date(2000, 1, 1)+relativedelta(nlyearday=260)
207 datetime.date(2000, 9, 17)
208
209rrule examples
210--------------
211These examples were converted from the RFC.
212
213Prepare the environment.
214
215.. testsetup:: rrule
216
217 from dateutil.rrule import *
218 from dateutil.parser import *
219 from datetime import *
220 import pprint
221 import sys
222 sys.displayhook = pprint.pprint
223
224.. doctest:: rrule
225
226 >>> from dateutil.rrule import *
227 >>> from dateutil.parser import *
228 >>> from datetime import *
229
230 >>> import pprint
231 >>> import sys
232 >>> sys.displayhook = pprint.pprint
233
234Daily, for 10 occurrences.
235
236.. doctest:: rrule
237
238 >>> list(rrule(DAILY, count=10,
239 dtstart=parse("19970902T090000")))
240 [datetime.datetime(1997, 9, 2, 9, 0),
241 datetime.datetime(1997, 9, 3, 9, 0),
242 datetime.datetime(1997, 9, 4, 9, 0),
243 datetime.datetime(1997, 9, 5, 9, 0),
244 datetime.datetime(1997, 9, 6, 9, 0),
245 datetime.datetime(1997, 9, 7, 9, 0),
246 datetime.datetime(1997, 9, 8, 9, 0),
247 datetime.datetime(1997, 9, 9, 9, 0),
248 datetime.datetime(1997, 9, 10, 9, 0),
249 datetime.datetime(1997, 9, 11, 9, 0)]
250
251Daily until December 24, 1997
252
253.. doctest:: rrule
254
255 >>> list(rrule(DAILY,
256 dtstart=parse("19970902T090000"),
257 until=parse("19971224T000000")))
258 [datetime.datetime(1997, 9, 2, 9, 0),
259 datetime.datetime(1997, 9, 3, 9, 0),
260 datetime.datetime(1997, 9, 4, 9, 0),
261 (...)
262 datetime.datetime(1997, 12, 21, 9, 0),
263 datetime.datetime(1997, 12, 22, 9, 0),
264 datetime.datetime(1997, 12, 23, 9, 0)]
265
266Every other day, 5 occurrences.
267
268.. doctest:: rrule
269
270 >>> list(rrule(DAILY, interval=2, count=5,
271 dtstart=parse("19970902T090000")))
272 [datetime.datetime(1997, 9, 2, 9, 0),
273 datetime.datetime(1997, 9, 4, 9, 0),
274 datetime.datetime(1997, 9, 6, 9, 0),
275 datetime.datetime(1997, 9, 8, 9, 0),
276 datetime.datetime(1997, 9, 10, 9, 0)]
277
278Every 10 days, 5 occurrences.
279
280.. doctest:: rrule
281
282 >>> list(rrule(DAILY, interval=10, count=5,
283 dtstart=parse("19970902T090000")))
284 [datetime.datetime(1997, 9, 2, 9, 0),
285 datetime.datetime(1997, 9, 12, 9, 0),
286 datetime.datetime(1997, 9, 22, 9, 0),
287 datetime.datetime(1997, 10, 2, 9, 0),
288 datetime.datetime(1997, 10, 12, 9, 0)]
289
290Everyday in January, for 3 years.
291
292.. doctest:: rrule
293
294 >>> list(rrule(YEARLY, bymonth=1, byweekday=range(7),
295 dtstart=parse("19980101T090000"),
296 until=parse("20000131T090000")))
297 [datetime.datetime(1998, 1, 1, 9, 0),
298 datetime.datetime(1998, 1, 2, 9, 0),
299 (...)
300 datetime.datetime(1998, 1, 30, 9, 0),
301 datetime.datetime(1998, 1, 31, 9, 0),
302 datetime.datetime(1999, 1, 1, 9, 0),
303 datetime.datetime(1999, 1, 2, 9, 0),
304 (...)
305 datetime.datetime(1999, 1, 30, 9, 0),
306 datetime.datetime(1999, 1, 31, 9, 0),
307 datetime.datetime(2000, 1, 1, 9, 0),
308 datetime.datetime(2000, 1, 2, 9, 0),
309 (...)
310 datetime.datetime(2000, 1, 29, 9, 0),
311 datetime.datetime(2000, 1, 31, 9, 0)]
312
313Same thing, in another way.
314
315.. doctest:: rrule
316
317 >>> list(rrule(DAILY, bymonth=1,
318 dtstart=parse("19980101T090000"),
319 until=parse("20000131T090000")))
320 (...)
321
322Weekly for 10 occurrences.
323
324.. doctest:: rrule
325
326 >>> list(rrule(WEEKLY, count=10,
327 dtstart=parse("19970902T090000")))
328 [datetime.datetime(1997, 9, 2, 9, 0),
329 datetime.datetime(1997, 9, 9, 9, 0),
330 datetime.datetime(1997, 9, 16, 9, 0),
331 datetime.datetime(1997, 9, 23, 9, 0),
332 datetime.datetime(1997, 9, 30, 9, 0),
333 datetime.datetime(1997, 10, 7, 9, 0),
334 datetime.datetime(1997, 10, 14, 9, 0),
335 datetime.datetime(1997, 10, 21, 9, 0),
336 datetime.datetime(1997, 10, 28, 9, 0),
337 datetime.datetime(1997, 11, 4, 9, 0)]
338
339Every other week, 6 occurrences.
340
341.. doctest:: rrule
342
343 >>> list(rrule(WEEKLY, interval=2, count=6,
344 dtstart=parse("19970902T090000")))
345 [datetime.datetime(1997, 9, 2, 9, 0),
346 datetime.datetime(1997, 9, 16, 9, 0),
347 datetime.datetime(1997, 9, 30, 9, 0),
348 datetime.datetime(1997, 10, 14, 9, 0),
349 datetime.datetime(1997, 10, 28, 9, 0),
350 datetime.datetime(1997, 11, 11, 9, 0)]
351
352Weekly on Tuesday and Thursday for 5 weeks.
353
354.. doctest:: rrule
355
356 >>> list(rrule(WEEKLY, count=10, wkst=SU, byweekday=(TU,TH),
357 dtstart=parse("19970902T090000")))
358 [datetime.datetime(1997, 9, 2, 9, 0),
359 datetime.datetime(1997, 9, 4, 9, 0),
360 datetime.datetime(1997, 9, 9, 9, 0),
361 datetime.datetime(1997, 9, 11, 9, 0),
362 datetime.datetime(1997, 9, 16, 9, 0),
363 datetime.datetime(1997, 9, 18, 9, 0),
364 datetime.datetime(1997, 9, 23, 9, 0),
365 datetime.datetime(1997, 9, 25, 9, 0),
366 datetime.datetime(1997, 9, 30, 9, 0),
367 datetime.datetime(1997, 10, 2, 9, 0)]
368
369Every other week on Tuesday and Thursday, for 8 occurrences.
370
371.. doctest:: rrule
372
373 >>> list(rrule(WEEKLY, interval=2, count=8,
374 wkst=SU, byweekday=(TU,TH),
375 dtstart=parse("19970902T090000")))
376 [datetime.datetime(1997, 9, 2, 9, 0),
377 datetime.datetime(1997, 9, 4, 9, 0),
378 datetime.datetime(1997, 9, 16, 9, 0),
379 datetime.datetime(1997, 9, 18, 9, 0),
380 datetime.datetime(1997, 9, 30, 9, 0),
381 datetime.datetime(1997, 10, 2, 9, 0),
382 datetime.datetime(1997, 10, 14, 9, 0),
383 datetime.datetime(1997, 10, 16, 9, 0)]
384
385Monthly on the 1st Friday for ten occurrences.
386
387.. doctest:: rrule
388
389 >>> list(rrule(MONTHLY, count=10, byweekday=FR(1),
390 dtstart=parse("19970905T090000")))
391 [datetime.datetime(1997, 9, 5, 9, 0),
392 datetime.datetime(1997, 10, 3, 9, 0),
393 datetime.datetime(1997, 11, 7, 9, 0),
394 datetime.datetime(1997, 12, 5, 9, 0),
395 datetime.datetime(1998, 1, 2, 9, 0),
396 datetime.datetime(1998, 2, 6, 9, 0),
397 datetime.datetime(1998, 3, 6, 9, 0),
398 datetime.datetime(1998, 4, 3, 9, 0),
399 datetime.datetime(1998, 5, 1, 9, 0),
400 datetime.datetime(1998, 6, 5, 9, 0)]
401
402Every other month on the 1st and last Sunday of the month for 10 occurrences.
403
404.. doctest:: rrule
405
406 >>> list(rrule(MONTHLY, interval=2, count=10,
407 byweekday=(SU(1), SU(-1)),
408 dtstart=parse("19970907T090000")))
409 [datetime.datetime(1997, 9, 7, 9, 0),
410 datetime.datetime(1997, 9, 28, 9, 0),
411 datetime.datetime(1997, 11, 2, 9, 0),
412 datetime.datetime(1997, 11, 30, 9, 0),
413 datetime.datetime(1998, 1, 4, 9, 0),
414 datetime.datetime(1998, 1, 25, 9, 0),
415 datetime.datetime(1998, 3, 1, 9, 0),
416 datetime.datetime(1998, 3, 29, 9, 0),
417 datetime.datetime(1998, 5, 3, 9, 0),
418 datetime.datetime(1998, 5, 31, 9, 0)]
419
420Monthly on the second to last Monday of the month for 6 months.
421
422.. doctest:: rrule
423
424 >>> list(rrule(MONTHLY, count=6, byweekday=MO(-2),
425 dtstart=parse("19970922T090000")))
426 [datetime.datetime(1997, 9, 22, 9, 0),
427 datetime.datetime(1997, 10, 20, 9, 0),
428 datetime.datetime(1997, 11, 17, 9, 0),
429 datetime.datetime(1997, 12, 22, 9, 0),
430 datetime.datetime(1998, 1, 19, 9, 0),
431 datetime.datetime(1998, 2, 16, 9, 0)]
432
433
434Monthly on the third to the last day of the month, for 6 months.
435
436.. doctest:: rrule
437
438 >>> list(rrule(MONTHLY, count=6, bymonthday=-3,
439 dtstart=parse("19970928T090000")))
440 [datetime.datetime(1997, 9, 28, 9, 0),
441 datetime.datetime(1997, 10, 29, 9, 0),
442 datetime.datetime(1997, 11, 28, 9, 0),
443 datetime.datetime(1997, 12, 29, 9, 0),
444 datetime.datetime(1998, 1, 29, 9, 0),
445 datetime.datetime(1998, 2, 26, 9, 0)]
446
447
448Monthly on the 2nd and 15th of the month for 5 occurrences.
449
450.. doctest:: rrule
451
452 >>> list(rrule(MONTHLY, count=5, bymonthday=(2,15),
453 dtstart=parse("19970902T090000")))
454 [datetime.datetime(1997, 9, 2, 9, 0),
455 datetime.datetime(1997, 9, 15, 9, 0),
456 datetime.datetime(1997, 10, 2, 9, 0),
457 datetime.datetime(1997, 10, 15, 9, 0),
458 datetime.datetime(1997, 11, 2, 9, 0)]
459
460
461Monthly on the first and last day of the month for 3 occurrences.
462
463.. doctest:: rrule
464
465 >>> list(rrule(MONTHLY, count=5, bymonthday=(-1,1,),
466 dtstart=parse("1997090
467 2T090000")))
468 [datetime.datetime(1997, 9, 30, 9, 0),
469 datetime.datetime(1997, 10, 1, 9, 0),
470 datetime.datetime(1997, 10, 31, 9, 0),
471 datetime.datetime(1997, 11, 1, 9, 0),
472 datetime.datetime(1997, 11, 30, 9, 0)]
473
474
475Every 18 months on the 10th thru 15th of the month for 10 occurrences.
476
477.. doctest:: rrule
478
479 >>> list(rrule(MONTHLY, interval=18, count=10,
480 bymonthday=range(10,16),
481 dtstart=parse("19970910T090000")))
482 [datetime.datetime(1997, 9, 10, 9, 0),
483 datetime.datetime(1997, 9, 11, 9, 0),
484 datetime.datetime(1997, 9, 12, 9, 0),
485 datetime.datetime(1997, 9, 13, 9, 0),
486 datetime.datetime(1997, 9, 14, 9, 0),
487 datetime.datetime(1997, 9, 15, 9, 0),
488 datetime.datetime(1999, 3, 10, 9, 0),
489 datetime.datetime(1999, 3, 11, 9, 0),
490 datetime.datetime(1999, 3, 12, 9, 0),
491 datetime.datetime(1999, 3, 13, 9, 0)]
492
493
494Every Tuesday, every other month, 6 occurences.
495
496.. doctest:: rrule
497
498 >>> list(rrule(MONTHLY, interval=2, count=6, byweekday=TU,
499 dtstart=parse("19970902T090000")))
500 [datetime.datetime(1997, 9, 2, 9, 0),
501 datetime.datetime(1997, 9, 9, 9, 0),
502 datetime.datetime(1997, 9, 16, 9, 0),
503 datetime.datetime(1997, 9, 23, 9, 0),
504 datetime.datetime(1997, 9, 30, 9, 0),
505 datetime.datetime(1997, 11, 4, 9, 0)]
506
507
508Yearly in June and July for 10 occurrences.
509
510.. doctest:: rrule
511
512 >>> list(rrule(YEARLY, count=4, bymonth=(6,7),
513 dtstart=parse("19970610T0900
514 00")))
515 [datetime.datetime(1997, 6, 10, 9, 0),
516 datetime.datetime(1997, 7, 10, 9, 0),
517 datetime.datetime(1998, 6, 10, 9, 0),
518 datetime.datetime(1998, 7, 10, 9, 0)]
519
520
521Every 3rd year on the 1st, 100th and 200th day for 4 occurrences.
522
523.. doctest:: rrule
524
525 >>> list(rrule(YEARLY, count=4, interval=3, byyearday=(1,100,200),
526 dtstart=parse("19970101T090000")))
527 [datetime.datetime(1997, 1, 1, 9, 0),
528 datetime.datetime(1997, 4, 10, 9, 0),
529 datetime.datetime(1997, 7, 19, 9, 0),
530 datetime.datetime(2000, 1, 1, 9, 0)]
531
532
533Every 20th Monday of the year, 3 occurrences.
534
535.. doctest:: rrule
536
537 >>> list(rrule(YEARLY, count=3, byweekday=MO(20),
538 dtstart=parse("19970519T090000")))
539 [datetime.datetime(1997, 5, 19, 9, 0),
540 datetime.datetime(1998, 5, 18, 9, 0),
541 datetime.datetime(1999, 5, 17, 9, 0)]
542
543
544Monday of week number 20 (where the default start of the week is Monday),
5453 occurrences.
546
547.. doctest:: rrule
548
549 >>> list(rrule(YEARLY, count=3, byweekno=20, byweekday=MO,
550 dtstart=parse("19970512T090000")))
551 [datetime.datetime(1997, 5, 12, 9, 0),
552 datetime.datetime(1998, 5, 11, 9, 0),
553 datetime.datetime(1999, 5, 17, 9, 0)]
554
555
556The week number 1 may be in the last year.
557
558.. doctest:: rrule
559
560 >>> list(rrule(WEEKLY, count=3, byweekno=1, byweekday=MO,
561 dtstart=parse("19970902T090000")))
562 [datetime.datetime(1997, 12, 29, 9, 0),
563 datetime.datetime(1999, 1, 4, 9, 0),
564 datetime.datetime(2000, 1, 3, 9, 0)]
565
566
567And the week numbers greater than 51 may be in the next year.
568
569.. doctest:: rrule
570
571 >>> list(rrule(WEEKLY, count=3, byweekno=52, byweekday=SU,
572 dtstart=parse("19970902T090000")))
573 [datetime.datetime(1997, 12, 28, 9, 0),
574 datetime.datetime(1998, 12, 27, 9, 0),
575 datetime.datetime(2000, 1, 2, 9, 0)]
576
577
578Only some years have week number 53:
579
580.. doctest:: rrule
581
582 >>> list(rrule(WEEKLY, count=3, byweekno=53, byweekday=MO,
583 dtstart=parse("19970902T090000")))
584 [datetime.datetime(1998, 12, 28, 9, 0),
585 datetime.datetime(2004, 12, 27, 9, 0),
586 datetime.datetime(2009, 12, 28, 9, 0)]
587
588
589Every Friday the 13th, 4 occurrences.
590
591.. doctest:: rrule
592
593 >>> list(rrule(YEARLY, count=4, byweekday=FR, bymonthday=13,
594 dtstart=parse("19970902T090000")))
595 [datetime.datetime(1998, 2, 13, 9, 0),
596 datetime.datetime(1998, 3, 13, 9, 0),
597 datetime.datetime(1998, 11, 13, 9, 0),
598 datetime.datetime(1999, 8, 13, 9, 0)]
599
600
601Every four years, the first Tuesday after a Monday in November,
6023 occurrences (U.S. Presidential Election day):
603
604.. doctest:: rrule
605
606 >>> list(rrule(YEARLY, interval=4, count=3, bymonth=11,
607 byweekday=TU, bymonthday=(2,3,4,5,6,7,8),
608 dtstart=parse("19961105T090000")))
609 [datetime.datetime(1996, 11, 5, 9, 0),
610 datetime.datetime(2000, 11, 7, 9, 0),
611 datetime.datetime(2004, 11, 2, 9, 0)]
612
613
614The 3rd instance into the month of one of Tuesday, Wednesday or
615Thursday, for the next 3 months:
616
617.. doctest:: rrule
618
619 >>> list(rrule(MONTHLY, count=3, byweekday=(TU,WE,TH),
620 bysetpos=3, dtstart=parse("19970904T090000")))
621 [datetime.datetime(1997, 9, 4, 9, 0),
622 datetime.datetime(1997, 10, 7, 9, 0),
623 datetime.datetime(1997, 11, 6, 9, 0)]
624
625
626The 2nd to last weekday of the month, 3 occurrences.
627
628.. doctest:: rrule
629
630 >>> list(rrule(MONTHLY, count=3, byweekday=(MO,TU,WE,TH,FR),
631 bysetpos=-2, dtstart=parse("19970929T090000")))
632 [datetime.datetime(1997, 9, 29, 9, 0),
633 datetime.datetime(1997, 10, 30, 9, 0),
634 datetime.datetime(1997, 11, 27, 9, 0)]
635
636
637Every 3 hours from 9:00 AM to 5:00 PM on a specific day.
638
639.. doctest:: rrule
640
641 >>> list(rrule(HOURLY, interval=3,
642 dtstart=parse("19970902T090000"),
643 until=parse("19970902T170000")))
644 [datetime.datetime(1997, 9, 2, 9, 0),
645 datetime.datetime(1997, 9, 2, 12, 0),
646 datetime.datetime(1997, 9, 2, 15, 0)]
647
648
649Every 15 minutes for 6 occurrences.
650
651.. doctest:: rrule
652
653 >>> list(rrule(MINUTELY, interval=15, count=6,
654 dtstart=parse("19970902T090000")))
655 [datetime.datetime(1997, 9, 2, 9, 0),
656 datetime.datetime(1997, 9, 2, 9, 15),
657 datetime.datetime(1997, 9, 2, 9, 30),
658 datetime.datetime(1997, 9, 2, 9, 45),
659 datetime.datetime(1997, 9, 2, 10, 0),
660 datetime.datetime(1997, 9, 2, 10, 15)]
661
662
663Every hour and a half for 4 occurrences.
664
665.. doctest:: rrule
666
667 >>> list(rrule(MINUTELY, interval=90, count=4,
668 dtstart=parse("19970902T090000")))
669 [datetime.datetime(1997, 9, 2, 9, 0),
670 datetime.datetime(1997, 9, 2, 10, 30),
671 datetime.datetime(1997, 9, 2, 12, 0),
672 datetime.datetime(1997, 9, 2, 13, 30)]
673
674
675Every 20 minutes from 9:00 AM to 4:40 PM for two days.
676
677.. doctest:: rrule
678
679 >>> list(rrule(MINUTELY, interval=20, count=48,
680 byhour=range(9,17), byminute=(0,20,40),
681 dtstart=parse("19970902T090000")))
682 [datetime.datetime(1997, 9, 2, 9, 0),
683 datetime.datetime(1997, 9, 2, 9, 20),
684 (...)
685 datetime.datetime(1997, 9, 2, 16, 20),
686 datetime.datetime(1997, 9, 2, 16, 40),
687 datetime.datetime(1997, 9, 3, 9, 0),
688 datetime.datetime(1997, 9, 3, 9, 20),
689 (...)
690 datetime.datetime(1997, 9, 3, 16, 20),
691 datetime.datetime(1997, 9, 3, 16, 40)]
692
693
694An example where the days generated makes a difference because of `wkst`.
695
696.. doctest:: rrule
697
698 >>> list(rrule(WEEKLY, interval=2, count=4,
699 byweekday=(TU,SU), wkst=MO,
700 dtstart=parse("19970805T090000")))
701 [datetime.datetime(1997, 8, 5, 9, 0),
702 datetime.datetime(1997, 8, 10, 9, 0),
703 datetime.datetime(1997, 8, 19, 9, 0),
704 datetime.datetime(1997, 8, 24, 9, 0)]
705
706 >>> list(rrule(WEEKLY, interval=2, count=4,
707 byweekday=(TU,SU), wkst=SU,
708 dtstart=parse("19970805T090000")))
709 [datetime.datetime(1997, 8, 5, 9, 0),
710 datetime.datetime(1997, 8, 17, 9, 0),
711 datetime.datetime(1997, 8, 19, 9, 0),
712 datetime.datetime(1997, 8, 31, 9, 0)]
713
714
715rruleset examples
716-----------------
717Daily, for 7 days, jumping Saturday and Sunday occurrences.
718
719.. doctest:: rruleset
720
721 >>> set = rruleset()
722 >>> set.rrule(rrule(DAILY, count=7,
723 dtstart=parse("19970902T090000")))
724 >>> set.exrule(rrule(YEARLY, byweekday=(SA,SU),
725 dtstart=parse("19970902T090000")))
726 >>> list(set)
727 [datetime.datetime(1997, 9, 2, 9, 0),
728 datetime.datetime(1997, 9, 3, 9, 0),
729 datetime.datetime(1997, 9, 4, 9, 0),
730 datetime.datetime(1997, 9, 5, 9, 0),
731 datetime.datetime(1997, 9, 8, 9, 0)]
732
733
734Weekly, for 4 weeks, plus one time on day 7, and not on day 16.
735
736.. doctest:: rruleset
737
738 >>> set = rruleset()
739 >>> set.rrule(rrule(WEEKLY, count=4,
740 dtstart=parse("19970902T090000")))
741 >>> set.rdate(datetime.datetime(1997, 9, 7, 9, 0))
742 >>> set.exdate(datetime.datetime(1997, 9, 16, 9, 0))
743 >>> list(set)
744 [datetime.datetime(1997, 9, 2, 9, 0),
745 datetime.datetime(1997, 9, 7, 9, 0),
746 datetime.datetime(1997, 9, 9, 9, 0),
747 datetime.datetime(1997, 9, 23, 9, 0)]
748
749
750rrulestr() examples
751-------------------
752
753Every 10 days, 5 occurrences.
754
755.. doctest:: rrulestr
756
757 >>> list(rrulestr("""
758 ... DTSTART:19970902T090000
759 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
760 ... """))
761 [datetime.datetime(1997, 9, 2, 9, 0),
762 datetime.datetime(1997, 9, 12, 9, 0),
763 datetime.datetime(1997, 9, 22, 9, 0),
764 datetime.datetime(1997, 10, 2, 9, 0),
765 datetime.datetime(1997, 10, 12, 9, 0)]
766
767
768Same thing, but passing only the `RRULE` value.
769
770.. doctest:: rrulestr
771
772 >>> list(rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5",
773 dtstart=parse("19970902T090000")))
774 [datetime.datetime(1997, 9, 2, 9, 0),
775 datetime.datetime(1997, 9, 12, 9, 0),
776 datetime.datetime(1997, 9, 22, 9, 0),
777 datetime.datetime(1997, 10, 2, 9, 0),
778 datetime.datetime(1997, 10, 12, 9, 0)]
779
780
781Notice that when using a single rule, it returns an
782`rrule` instance, unless `forceset` was used.
783
784.. doctest:: rrulestr
785
786 >>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5")
787 <dateutil.rrule.rrule instance at 0x30269f08>
788
789 >>> rrulestr("""
790 ... DTSTART:19970902T090000
791 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
792 ... """)
793 <dateutil.rrule.rrule instance at 0x302699e0>
794
795 >>> rrulestr("FREQ=DAILY;INTERVAL=10;COUNT=5", forceset=True)
796 <dateutil.rrule.rruleset instance at 0x30269f08>
797
798
799But when an `rruleset` is needed, it is automatically used.
800
801.. doctest:: rrulestr
802
803 >>> rrulestr("""
804 ... DTSTART:19970902T090000
805 ... RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
806 ... RRULE:FREQ=DAILY;INTERVAL=5;COUNT=3
807 ... """)
808 <dateutil.rrule.rruleset instance at 0x302699e0>
809
810
811parse examples
812-----------
813The following code will prepare the environment:
814
815.. doctest:: tz
816
817 >>> from dateutil.parser import *
818 >>> from dateutil.tz import *
819 >>> from datetime import *
820 >>> TZOFFSETS = {"BRST": -10800}
821 >>> BRSTTZ = tzoffset(-10800, "BRST")
822 >>> DEFAULT = datetime(2003, 9, 25)
823
824
825Some simple examples based on the `date` command, using the
826`ZOFFSET` dictionary to provide the BRST timezone offset.
827
828.. doctest:: tz
829
830 >>> parse("Thu Sep 25 10:36:28 BRST 2003", tzinfos=TZOFFSETS)
831 datetime.datetime(2003, 9, 25, 10, 36, 28,
832 tzinfo=tzoffset('BRST', -10800))
833
834 >>> parse("2003 10:36:28 BRST 25 Sep Thu", tzinfos=TZOFFSETS)
835 datetime.datetime(2003, 9, 25, 10, 36, 28,
836 tzinfo=tzoffset('BRST', -10800))
837
838
839Notice that since BRST is my local timezone, parsing it without
840further timezone settings will yield a `tzlocal` timezone.
841
842.. doctest:: tz
843
844 >>> parse("Thu Sep 25 10:36:28 BRST 2003")
845 datetime.datetime(2003, 9, 25, 10, 36, 28, tzinfo=tzlocal())
846
847
848We can also ask to ignore the timezone explicitly:
849
850.. doctest:: tz
851
852 >>> parse("Thu Sep 25 10:36:28 BRST 2003", ignoretz=True)
853 datetime.datetime(2003, 9, 25, 10, 36, 28)
854
855
856That's the same as processing a string without timezone:
857
858.. doctest:: tz
859
860 >>> parse("Thu Sep 25 10:36:28 2003")
861 datetime.datetime(2003, 9, 25, 10, 36, 28)
862
863
864Without the year, but passing our `DEFAULT` datetime to return
865the same year, no mattering what year we currently are in:
866
867.. doctest:: tz
868
869 >>> parse("Thu Sep 25 10:36:28", default=DEFAULT)
870 datetime.datetime(2003, 9, 25, 10, 36, 28)
871
872
873Strip it further:
874
875.. doctest:: tz
876
877 >>> parse("Thu Sep 10:36:28", default=DEFAULT)
878 datetime.datetime(2003, 9, 25, 10, 36, 28)
879
880 >>> parse("Thu 10:36:28", default=DEFAULT)
881 datetime.datetime(2003, 9, 25, 10, 36, 28)
882
883 >>> parse("Thu 10:36", default=DEFAULT)
884 datetime.datetime(2003, 9, 25, 10, 36)
885
886 >>> parse("10:36", default=DEFAULT)
887 datetime.datetime(2003, 9, 25, 10, 36)
888 >>>
889
890
891Strip in a different way:
892
893.. doctest:: tz
894
895 >>> parse("Thu Sep 25 2003")
896 datetime.datetime(2003, 9, 25, 0, 0)
897
898 >>> parse("Sep 25 2003")
899 datetime.datetime(2003, 9, 25, 0, 0)
900
901 >>> parse("Sep 2003", default=DEFAULT)
902 datetime.datetime(2003, 9, 25, 0, 0)
903
904 >>> parse("Sep", default=DEFAULT)
905 datetime.datetime(2003, 9, 25, 0, 0)
906
907 >>> parse("2003", default=DEFAULT)
908 datetime.datetime(2003, 9, 25, 0, 0)
909
910
911Another format, based on `date -R` (RFC822):
912
913.. doctest:: tz
914
915 >>> parse("Thu, 25 Sep 2003 10:49:41 -0300")
916 datetime.datetime(2003, 9, 25, 10, 49, 41,
917 tzinfo=tzoffset(None, -10800))
918
919
920ISO format:
921
922.. doctest:: tz
923
924 >>> parse("2003-09-25T10:49:41.5-03:00")
925 datetime.datetime(2003, 9, 25, 10, 49, 41, 500000,
926 tzinfo=tzoffset(None, -10800))
927
928
929Some variations:
930
931.. doctest:: tz
932
933 >>> parse("2003-09-25T10:49:41")
934 datetime.datetime(2003, 9, 25, 10, 49, 41)
935
936 >>> parse("2003-09-25T10:49")
937 datetime.datetime(2003, 9, 25, 10, 49)
938
939 >>> parse("2003-09-25T10")
940 datetime.datetime(2003, 9, 25, 10, 0)
941
942 >>> parse("2003-09-25")
943 datetime.datetime(2003, 9, 25, 0, 0)
944
945
946ISO format, without separators:
947
948.. doctest:: tz
949
950 >>> parse("20030925T104941.5-0300")
951 datetime.datetime(2003, 9, 25, 10, 49, 41, 500000,
952 tzinfo=tzinfo=tzoffset(None, -10800))
953
954 >>> parse("20030925T104941-0300")
955 datetime.datetime(2003, 9, 25, 10, 49, 41,
956 tzinfo=tzoffset(None, -10800))
957
958 >>> parse("20030925T104941")
959 datetime.datetime(2003, 9, 25, 10, 49, 41)
960
961 >>> parse("20030925T1049")
962 datetime.datetime(2003, 9, 25, 10, 49)
963
964 >>> parse("20030925T10")
965 datetime.datetime(2003, 9, 25, 10, 0)
966
967 >>> parse("20030925")
968 datetime.datetime(2003, 9, 25, 0, 0)
969
970
971Everything together.
972
973.. doctest:: tz
974
975 >>> parse("199709020900")
976 datetime.datetime(1997, 9, 2, 9, 0)
977 >>> parse("19970902090059")
978 datetime.datetime(1997, 9, 2, 9, 0, 59)
979
980
981Different date orderings:
982
983.. doctest:: tz
984
985 >>> parse("2003-09-25")
986 datetime.datetime(2003, 9, 25, 0, 0)
987
988 >>> parse("2003-Sep-25")
989 datetime.datetime(2003, 9, 25, 0, 0)
990
991 >>> parse("25-Sep-2003")
992 datetime.datetime(2003, 9, 25, 0, 0)
993
994 >>> parse("Sep-25-2003")
995 datetime.datetime(2003, 9, 25, 0, 0)
996
997 >>> parse("09-25-2003")
998 datetime.datetime(2003, 9, 25, 0, 0)
999
1000 >>> parse("25-09-2003")
1001 datetime.datetime(2003, 9, 25, 0, 0)
1002
1003
1004Check some ambiguous dates:
1005
1006.. doctest:: tz
1007
1008 >>> parse("10-09-2003")
1009 datetime.datetime(2003, 10, 9, 0, 0)
1010
1011 >>> parse("10-09-2003", dayfirst=True)
1012 datetime.datetime(2003, 9, 10, 0, 0)
1013
1014 >>> parse("10-09-03")
1015 datetime.datetime(2003, 10, 9, 0, 0)
1016
1017 >>> parse("10-09-03", yearfirst=True)
1018 datetime.datetime(2010, 9, 3, 0, 0)
1019
1020
1021Other date separators are allowed:
1022
1023.. doctest:: tz
1024
1025 >>> parse("2003.Sep.25")
1026 datetime.datetime(2003, 9, 25, 0, 0)
1027
1028 >>> parse("2003/09/25")
1029 datetime.datetime(2003, 9, 25, 0, 0)
1030
1031
1032Even with spaces:
1033
1034.. doctest:: tz
1035
1036 >>> parse("2003 Sep 25")
1037 datetime.datetime(2003, 9, 25, 0, 0)
1038
1039 >>> parse("2003 09 25")
1040 datetime.datetime(2003, 9, 25, 0, 0)
1041
1042
1043Hours with letters work:
1044
1045.. doctest:: tz
1046
1047 >>> parse("10h36m28.5s", default=DEFAULT)
1048 datetime.datetime(2003, 9, 25, 10, 36, 28, 500000)
1049
1050 >>> parse("01s02h03m", default=DEFAULT)
1051 datetime.datetime(2003, 9, 25, 2, 3, 1)
1052
1053 >>> parse("01h02m03", default=DEFAULT)
1054 datetime.datetime(2003, 9, 3, 1, 2)
1055
1056 >>> parse("01h02", default=DEFAULT)
1057 datetime.datetime(2003, 9, 2, 1, 0)
1058
1059 >>> parse("01h02s", default=DEFAULT)
1060 datetime.datetime(2003, 9, 25, 1, 0, 2)
1061
1062
1063With AM/PM:
1064
1065.. doctest:: tz
1066
1067 >>> parse("10h am", default=DEFAULT)
1068 datetime.datetime(2003, 9, 25, 10, 0)
1069
1070 >>> parse("10pm", default=DEFAULT)
1071 datetime.datetime(2003, 9, 25, 22, 0)
1072
1073 >>> parse("12:00am", default=DEFAULT)
1074 datetime.datetime(2003, 9, 25, 0, 0)
1075
1076 >>> parse("12pm", default=DEFAULT)
1077 datetime.datetime(2003, 9, 25, 12, 0)
1078
1079
1080Some special treating for ''pertain'' relations:
1081
1082.. doctest:: tz
1083
1084 >>> parse("Sep 03", default=DEFAULT)
1085 datetime.datetime(2003, 9, 3, 0, 0)
1086
1087 >>> parse("Sep of 03", default=DEFAULT)
1088 datetime.datetime(2003, 9, 25, 0, 0)
1089
1090
1091Fuzzy parsing:
1092
1093.. doctest:: tz
1094
1095 >>> s = "Today is 25 of September of 2003, exactly " \
1096 ... "at 10:49:41 with timezone -03:00."
1097 >>> parse(s, fuzzy=True)
1098 datetime.datetime(2003, 9, 25, 10, 49, 41,
1099 tzinfo=tzoffset(None, -10800))
1100
1101
1102Other random formats:
1103
1104.. doctest:: tz
1105
1106 >>> parse("Wed, July 10, '96")
1107 datetime.datetime(1996, 7, 10, 0, 0)
1108
1109 >>> parse("1996.07.10 AD at 15:08:56 PDT", ignoretz=True)
1110 datetime.datetime(1996, 7, 10, 15, 8, 56)
1111
1112 >>> parse("Tuesday, April 12, 1952 AD 3:30:42pm PST", ignoretz=True)
1113 datetime.datetime(1952, 4, 12, 15, 30, 42)
1114
1115 >>> parse("November 5, 1994, 8:15:30 am EST", ignoretz=True)
1116 datetime.datetime(1994, 11, 5, 8, 15, 30)
1117
1118 >>> parse("3rd of May 2001")
1119 datetime.datetime(2001, 5, 3, 0, 0)
1120
1121 >>> parse("5:50 A.M. on June 13, 1990")
1122 datetime.datetime(1990, 6, 13, 5, 50)
1123
1124
1125tzutc examples
1126--------------
1127
1128.. doctest:: tzutc
1129
1130 >>> from datetime import *
1131 >>> from dateutil.tz import *
1132
1133 >>> datetime.now()
1134 datetime.datetime(2003, 9, 27, 9, 40, 1, 521290)
1135
1136 >>> datetime.now(tzutc())
1137 datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc())
1138
1139 >>> datetime.now(tzutc()).tzname()
1140 'UTC'
1141
1142
1143tzoffset examples
1144-----------------
1145
1146.. doctest:: tzoffset
1147
1148 >>> from datetime import *
1149 >>> from dateutil.tz import *
1150
1151 >>> datetime.now(tzoffset("BRST", -10800))
1152 datetime.datetime(2003, 9, 27, 9, 52, 43, 624904,
1153 tzinfo=tzinfo=tzoffset('BRST', -10800))
1154
1155 >>> datetime.now(tzoffset("BRST", -10800)).tzname()
1156 'BRST'
1157
1158 >>> datetime.now(tzoffset("BRST", -10800)).astimezone(tzutc())
1159 datetime.datetime(2003, 9, 27, 12, 53, 11, 446419,
1160 tzinfo=tzutc())
1161
1162
1163tzlocal examples
1164----------------
1165
1166.. doctest:: tzlocal
1167
1168 >>> from datetime import *
1169 >>> from dateutil.tz import *
1170
1171 >>> datetime.now(tzlocal())
1172 datetime.datetime(2003, 9, 27, 10, 1, 43, 673605,
1173 tzinfo=tzlocal())
1174
1175 >>> datetime.now(tzlocal()).tzname()
1176 'BRST'
1177
1178 >>> datetime.now(tzlocal()).astimezone(tzoffset(None, 0))
1179 datetime.datetime(2003, 9, 27, 13, 3, 0, 11493,
1180 tzinfo=tzoffset(None, 0))
1181
1182
1183tzstr examples
1184--------------
1185Here are examples of the recognized formats:
1186
1187 * `EST5EDT`
1188 * `EST5EDT,4,0,6,7200,10,0,26,7200,3600`
1189 * `EST5EDT,4,1,0,7200,10,-1,0,7200,3600`
1190 * `EST5EDT4,M4.1.0/02:00:00,M10-5-0/02:00`
1191 * `EST5EDT4,95/02:00:00,298/02:00`
1192 * `EST5EDT4,J96/02:00:00,J299/02:00`
1193
1194Notice that if daylight information is not present, but a
1195daylight abbreviation was provided, `tzstr` will follow the
1196convention of using the first sunday of April to start daylight
1197saving, and the last sunday of October to end it. If start or
1198end time is not present, 2AM will be used, and if the daylight
1199offset is not present, the standard offset plus one hour will
1200be used. This convention is the same as used in the GNU libc.
1201
1202This also means that some of the above examples are exactly
1203equivalent, and all of these examples are equivalent
1204in the year of 2003.
1205
1206Here is the example mentioned in the
1207
1208[http://www.python.org/doc/current/lib/module-time.html time module documentation].
1209
1210
1211.. doctest:: tzstr
1212
1213 >>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'
1214 >>> time.tzset()
1215 >>> time.strftime('%X %x %Z')
1216 '02:07:36 05/08/03 EDT'
1217 >>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
1218 >>> time.tzset()
1219 >>> time.strftime('%X %x %Z')
1220 '16:08:12 05/08/03 AEST'
1221
1222
1223And here is an example showing the same information using `tzstr`,
1224without touching system settings.
1225
1226.. doctest:: tzstr
1227
1228 >>> tz1 = tzstr('EST+05EDT,M4.1.0,M10.5.0')
1229 >>> tz2 = tzstr('AEST-10AEDT-11,M10.5.0,M3.5.0')
1230 >>> dt = datetime(2003, 5, 8, 2, 7, 36, tzinfo=tz1)
1231 >>> dt.strftime('%X %x %Z')
1232 '02:07:36 05/08/03 EDT'
1233 >>> dt.astimezone(tz2).strftime('%X %x %Z')
1234 '16:07:36 05/08/03 AEST'
1235
1236
1237Are these really equivalent?
1238
1239.. doctest:: tzstr
1240
1241 >>> tzstr('EST5EDT') == tzstr('EST5EDT,4,1,0,7200,10,-1,0,7200,3600')
1242 True
1243
1244
1245Check the daylight limit.
1246
1247.. doctest:: tzstr
1248
1249 >>> datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname()
1250 'EST'
1251 >>> datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname()
1252 'EDT'
1253 >>> datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname()
1254 'EDT'
1255 >>> datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname()
1256 'EST'
1257
1258
1259tzrange examples
1260----------------
1261
1262.. doctest:: tzrange
1263
1264 >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT")
1265 True
1266
1267 >>> from dateutil.relativedelta import *
1268 >>> range1 = tzrange("EST", -18000, "EDT")
1269 >>> range2 = tzrange("EST", -18000, "EDT", -14400,
1270 ... relativedelta(hours=+2, month=4, day=1,
1271 weekday=SU(+1)),
1272 ... relativedelta(hours=+1, month=10, day=31,
1273 weekday=SU(-1)))
1274 >>> tzstr('EST5EDT') == range1 == range2
1275 True
1276
1277
1278Notice a minor detail in the last example: while the DST should end
1279at 2AM, the delta will catch 1AM. That's because the daylight saving
1280time should end at 2AM standard time (the difference between STD and
1281DST is 1h in the given example) instead of the DST time. That's how
1282the `tzinfo` subtypes should deal with the extra hour that happens
1283when going back to the standard time. Check
1284
1285[http://www.python.org/doc/current/lib/datetime-tzinfo.html tzinfo documentation]
1286
1287for more information.
1288
1289tzfile examples
1290---------------
1291
1292.. doctest:: tzfile
1293
1294 >>> tz = tzfile("/etc/localtime")
1295 >>> datetime.now(tz)
1296 datetime.datetime(2003, 9, 27, 12, 3, 48, 392138,
1297 tzinfo=tzfile('/etc/localtime'))
1298
1299 >>> datetime.now(tz).astimezone(tzutc())
1300 datetime.datetime(2003, 9, 27, 15, 3, 53, 70863,
1301 tzinfo=tzutc())
1302
1303 >>> datetime.now(tz).tzname()
1304 'BRST'
1305 >>> datetime(2003, 1, 1, tzinfo=tz).tzname()
1306 'BRDT'
1307
1308
1309Check the daylight limit.
1310
1311.. doctest:: tzfile
1312
1313 >>> tz = tzfile('/usr/share/zoneinfo/EST5EDT')
1314 >>> datetime(2003, 4, 6, 1, 59, tzinfo=tz).tzname()
1315 'EST'
1316 >>> datetime(2003, 4, 6, 2, 00, tzinfo=tz).tzname()
1317 'EDT'
1318 >>> datetime(2003, 10, 26, 0, 59, tzinfo=tz).tzname()
1319 'EDT'
1320 >>> datetime(2003, 10, 26, 1, 00, tzinfo=tz).tzname()
1321 'EST'
1322
1323
1324tzical examples
1325---------------
1326Here is a sample file extracted from the RFC. This file defines
1327the `EST5EDT` timezone, and will be used in the following example.
1328
1329 BEGIN:VTIMEZONE
1330 TZID:US-Eastern
1331 LAST-MODIFIED:19870101T000000Z
1332 TZURL:http://zones.stds_r_us.net/tz/US-Eastern
1333 BEGIN:STANDARD
1334 DTSTART:19671029T020000
1335 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
1336 TZOFFSETFROM:-0400
1337 TZOFFSETTO:-0500
1338 TZNAME:EST
1339 END:STANDARD
1340 BEGIN:DAYLIGHT
1341 DTSTART:19870405T020000
1342 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
1343 TZOFFSETFROM:-0500
1344 TZOFFSETTO:-0400
1345 TZNAME:EDT
1346 END:DAYLIGHT
1347 END:VTIMEZONE
1348
1349And here is an example exploring a `tzical` type:
1350
1351.. doctest:: tzfile
1352
1353 >>> from dateutil.tz import *; from datetime import *
1354
1355 >>> tz = tzical('EST5EDT.ics')
1356 >>> tz.keys()
1357 ['US-Eastern']
1358
1359 >>> est = tz.get('US-Eastern')
1360 >>> est
1361 <tzicalvtz 'US-Eastern'>
1362
1363 >>> datetime.now(est)
1364 datetime.datetime(2003, 10, 6, 19, 44, 18, 667987,
1365 tzinfo=<tzicalvtz 'US-Eastern'>)
1366
1367 >>> est == tz.get()
1368 True
1369
1370
1371Let's check the daylight ranges, as usual:
1372
1373.. doctest:: tzfile
1374
1375 >>> datetime(2003, 4, 6, 1, 59, tzinfo=est).tzname()
1376 'EST'
1377 >>> datetime(2003, 4, 6, 2, 00, tzinfo=est).tzname()
1378 'EDT'
1379
1380 >>> datetime(2003, 10, 26, 0, 59, tzinfo=est).tzname()
1381 'EDT'
1382 >>> datetime(2003, 10, 26, 1, 00, tzinfo=est).tzname()
1383 'EST'
1384
1385
1386tzwin examples
1387--------------
1388
1389.. doctest:: tzwin
1390
1391 >>> tz = tzwin("E. South America Standard Time")
1392
1393
1394tzwinlocal examples
1395-------------------
1396
1397
1398.. doctest:: tzwinlocal
1399
1400 >>> tz = tzwinlocal()
1401
1402# vim:ts=4:sw=4:et