blob: 67c94dec6e1278d90b873150caa57ad731f7252c [file] [log] [blame]
Guido van Rossum2db91351992-10-18 17:09:59 +00001# Parse a timezone specification.
2# XXX Unfinished.
3# XXX Only the typical form "XXXhhYYY;ddd/hh,ddd/hh" is currently supported.
4
5tzpat = '^\([A-Z][A-Z][A-Z]\)\([-+]?[0-9]+\)\([A-Z][A-Z][A-Z]\);' + \
6 '\([0-9]+\)/\([0-9]+\),\([0-9]+\)/\([0-9]+\)$'
7
8tzprog = None
9
10def tzparse(tzstr):
11 global tzprog
12 if tzprog == None:
13 import regex
14 tzprog = regex.compile(tzpat)
15 if not tzprog.match(tzstr):
16 raise ValueError, 'not the TZ syntax I understand'
17 regs = tzprog.regs
18 subs = []
19 for i in range(1, 8):
20 a, b = regs[i]
21 subs.append(tzstr[a:b])
22 for i in (1, 3, 4, 5, 6):
23 subs[i] = eval(subs[i])
24 [tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs
25 return (tzname, delta, dstname, daystart, hourstart, dayend, hourend)
26
27def tzlocaltime(time, params):
28 import calendar
29 (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = params
30 year, month, days, hours, mins, secs, yday, wday = \
31 calendar.gmtime(time - delta*3600)
32 if (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend):
33 tzname = dstname
34 hours = hours + 1
35 return year, month, days, hours, mins, secs, yday, wday, tzname
36
37def tzset():
38 global tzparams, timezone, altzone, daylight, tzname
39 import os
40 tzstr = os.environ['TZ']
41 tzparams = tzparse(tzstr)
42 timezone = tzparams[1] * 3600
43 altzone = timezone + 3600
44 daylight = 1
45 tzname = tzparams[0], tzparams[2]
46
47def isdst(time):
48 import calendar
49 (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = \
50 tzparams
51 year, month, days, hours, mins, secs, yday, wday = \
52 calendar.gmtime(time - delta*3600)
53 return (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend)
54
55tzset()
56
57def localtime(time):
58 return tzlocaltime(time, tzparams)
59
60def test():
61 from calendar import asctime, gmtime
62 import time, sys
63 now = time.time()
64 x = localtime(now)
65 print 'now =', now, '=', asctime(x[:-1]), x[-1]
66 now = now - now % (24*3600)
67 if sys.argv[1:]: now = now + eval(sys.argv[1])
68 x = gmtime(now)
69 print 'gmtime =', now, '=', asctime(x), 'yday =', x[-2]
70 jan1 = now - x[-2]*24*3600
71 x = localtime(jan1)
72 print 'jan1 =', jan1, '=', asctime(x[:-1]), x[-1]
73 for d in range(85, 95) + range(265, 275):
74 t = jan1 + d*24*3600
75 x = localtime(t)
76 print 'd =', d, 't =', t, '=', asctime(x[:-1]), x[-1]