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