diff options
author | Tim Peters <tim.peters@gmail.com> | 2003-01-04 06:03:15 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2003-01-04 06:03:15 (GMT) |
commit | adf642038ee02b02165c3852a72217c1b65d8715 (patch) | |
tree | f56c8a77815f7fa05c9b10172e4cfe32c3eeb492 /Doc/lib/tzinfo-examples.py | |
parent | 8ec78814c138a24038d104507879bf11df09dcce (diff) | |
download | cpython-adf642038ee02b02165c3852a72217c1b65d8715.zip cpython-adf642038ee02b02165c3852a72217c1b65d8715.tar.gz cpython-adf642038ee02b02165c3852a72217c1b65d8715.tar.bz2 |
A new implementation of astimezone() that does what we agreed on in all
cases, plus even tougher tests of that. This implementation follows
the correctness proof very closely, and should also be quicker (yes,
I wrote the proof before the code, and the code proves the proof <wink>).
Diffstat (limited to 'Doc/lib/tzinfo-examples.py')
-rw-r--r-- | Doc/lib/tzinfo-examples.py | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/Doc/lib/tzinfo-examples.py b/Doc/lib/tzinfo-examples.py index 92f298c..70a4966 100644 --- a/Doc/lib/tzinfo-examples.py +++ b/Doc/lib/tzinfo-examples.py @@ -1,6 +1,7 @@ -from datetime import tzinfo, timedelta +from datetime import tzinfo, timedelta, datetime ZERO = timedelta(0) +HOUR = timedelta(hours=1) # A UTC class. @@ -76,3 +77,63 @@ class LocalTimezone(tzinfo): return tt.tm_isdst > 0 Local = LocalTimezone() + + +# A complete implementation of current DST rules for major US time zones. + +def first_sunday_on_or_after(dt): + days_to_go = 6 - dt.weekday() + if days_to_go: + dt += timedelta(days_to_go) + return dt + +# In the US, DST starts at 2am (standard time) on the first Sunday in April. +DSTSTART = datetime(1, 4, 1, 2) +# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct. +# which is the first Sunday on or after Oct 25. +DSTEND = datetime(1, 10, 25, 2) + +class USTimeZone(tzinfo): + + def __init__(self, hours, reprname, stdname, dstname): + self.stdoffset = timedelta(hours=hours) + self.reprname = reprname + self.stdname = stdname + self.dstname = dstname + + def __repr__(self): + return self.reprname + + def tzname(self, dt): + if self.dst(dt): + return self.dstname + else: + return self.stdname + + def utcoffset(self, dt): + return self.stdoffset + self.dst(dt) + + def dst(self, dt): + if dt is None or dt.tzinfo is None: + # An exception may be sensible here, in one or both cases. + # It depends on how you want to treat them. The astimezone() + # implementation always passes a datetimetz with + # dt.tzinfo == self. + return ZERO + assert dt.tzinfo is self + + # Find first Sunday in April & the last in October. + start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year)) + end = first_sunday_on_or_after(DSTEND.replace(year=dt.year)) + + # Can't compare naive to aware objects, so strip the timezone from + # dt first. + if start <= dt.replace(tzinfo=None) < end: + return HOUR + else: + return ZERO + +Eastern = USTimeZone(-5, "Eastern", "EST", "EDT") +Central = USTimeZone(-6, "Central", "CST", "CDT") +Mountain = USTimeZone(-7, "Mountain", "MST", "MDT") +Pacific = USTimeZone(-8, "Pacific", "PST", "PDT") |