blob: 358e0cc25e276faa9cef1b5c86dcff427db356dd [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
Guido van Rossum9694fca1997-10-22 21:00:49 +00005tzpat = ('^([A-Z][A-Z][A-Z])([-+]?[0-9]+)([A-Z][A-Z][A-Z]);'
6 '([0-9]+)/([0-9]+),([0-9]+)/([0-9]+)$')
Guido van Rossum2db91351992-10-18 17:09:59 +00007
8tzprog = None
9
10def tzparse(tzstr):
11 global tzprog
12 if tzprog == None:
Guido van Rossum9694fca1997-10-22 21:00:49 +000013 import re
14 tzprog = re.compile(tzpat)
15 match = tzprog.match(tzstr)
16 if not match:
Guido van Rossum2db91351992-10-18 17:09:59 +000017 raise ValueError, 'not the TZ syntax I understand'
Guido van Rossum2db91351992-10-18 17:09:59 +000018 subs = []
19 for i in range(1, 8):
Guido van Rossum9694fca1997-10-22 21:00:49 +000020 subs.append(match.group(i))
Guido van Rossum2db91351992-10-18 17:09:59 +000021 for i in (1, 3, 4, 5, 6):
22 subs[i] = eval(subs[i])
23 [tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs
24 return (tzname, delta, dstname, daystart, hourstart, dayend, hourend)
25
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000026def tzlocaltime(secs, params):
27 import time
Guido van Rossum2db91351992-10-18 17:09:59 +000028 (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = params
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000029 year, month, days, hours, mins, secs, yday, wday, isdst = \
30 time.gmtime(secs - delta*3600)
Guido van Rossum2db91351992-10-18 17:09:59 +000031 if (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend):
32 tzname = dstname
33 hours = hours + 1
34 return year, month, days, hours, mins, secs, yday, wday, tzname
35
36def tzset():
37 global tzparams, timezone, altzone, daylight, tzname
38 import os
39 tzstr = os.environ['TZ']
40 tzparams = tzparse(tzstr)
41 timezone = tzparams[1] * 3600
Guido van Rossume7113b61993-03-29 11:30:50 +000042 altzone = timezone - 3600
Guido van Rossum2db91351992-10-18 17:09:59 +000043 daylight = 1
44 tzname = tzparams[0], tzparams[2]
45
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000046def isdst(secs):
47 import time
Guido van Rossum2db91351992-10-18 17:09:59 +000048 (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = \
49 tzparams
Guido van Rossum9b3bc711993-06-20 21:02:22 +000050 year, month, days, hours, mins, secs, yday, wday, isdst = \
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000051 time.gmtime(secs - delta*3600)
Guido van Rossum2db91351992-10-18 17:09:59 +000052 return (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend)
53
54tzset()
55
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000056def localtime(secs):
57 return tzlocaltime(secs, tzparams)
Guido van Rossum2db91351992-10-18 17:09:59 +000058
59def test():
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000060 from time import asctime, gmtime
Guido van Rossum2db91351992-10-18 17:09:59 +000061 import time, sys
62 now = time.time()
63 x = localtime(now)
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000064 tm = x[:-1] + (0,)
65 print 'now =', now, '=', asctime(tm), x[-1]
Guido van Rossum2db91351992-10-18 17:09:59 +000066 now = now - now % (24*3600)
67 if sys.argv[1:]: now = now + eval(sys.argv[1])
68 x = gmtime(now)
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000069 tm = x[:-1] + (0,)
70 print 'gmtime =', now, '=', asctime(tm), 'yday =', x[-2]
Guido van Rossum2db91351992-10-18 17:09:59 +000071 jan1 = now - x[-2]*24*3600
72 x = localtime(jan1)
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000073 tm = x[:-1] + (0,)
74 print 'jan1 =', jan1, '=', asctime(tm), x[-1]
Guido van Rossum2db91351992-10-18 17:09:59 +000075 for d in range(85, 95) + range(265, 275):
76 t = jan1 + d*24*3600
77 x = localtime(t)
Guido van Rossum5cfa5df1993-06-23 09:30:50 +000078 tm = x[:-1] + (0,)
79 print 'd =', d, 't =', t, '=', asctime(tm), x[-1]