1 from datetime
import tzinfo
, timedelta
, datetime
4 HOUR
= timedelta(hours
=1)
11 def utcoffset(self
, dt
):
22 # A class building tzinfo objects for fixed-offset time zones.
23 # Note that FixedOffset(0, "UTC") is a different way to build a
26 class FixedOffset(tzinfo
):
27 """Fixed offset in minutes east from UTC."""
29 def __init__(self
, offset
, name
):
30 self
.__offset
= timedelta(minutes
= offset
)
33 def utcoffset(self
, dt
):
42 # A class capturing the platform's idea of local time.
46 STDOFFSET
= timedelta(seconds
= -_time
.timezone
)
48 DSTOFFSET
= timedelta(seconds
= -_time
.altzone
)
52 DSTDIFF
= DSTOFFSET
- STDOFFSET
54 class LocalTimezone(tzinfo
):
56 def utcoffset(self
, dt
):
69 return _time
.tzname
[self
._isdst
(dt
)]
72 tt
= (dt
.year
, dt
.month
, dt
.day
,
73 dt
.hour
, dt
.minute
, dt
.second
,
75 stamp
= _time
.mktime(tt
)
76 tt
= _time
.localtime(stamp
)
77 return tt
.tm_isdst
> 0
79 Local
= LocalTimezone()
82 # A complete implementation of current DST rules for major US time zones.
84 def first_sunday_on_or_after(dt
):
85 days_to_go
= 6 - dt
.weekday()
87 dt
+= timedelta(days_to_go
)
90 # In the US, DST starts at 2am (standard time) on the first Sunday in April.
91 DSTSTART
= datetime(1, 4, 1, 2)
92 # and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct.
93 # which is the first Sunday on or after Oct 25.
94 DSTEND
= datetime(1, 10, 25, 1)
96 class USTimeZone(tzinfo
):
98 def __init__(self
, hours
, reprname
, stdname
, dstname
):
99 self
.stdoffset
= timedelta(hours
=hours
)
100 self
.reprname
= reprname
101 self
.stdname
= stdname
102 self
.dstname
= dstname
107 def tzname(self
, dt
):
113 def utcoffset(self
, dt
):
114 return self
.stdoffset
+ self
.dst(dt
)
117 if dt
is None or dt
.tzinfo
is None:
118 # An exception may be sensible here, in one or both cases.
119 # It depends on how you want to treat them. The default
120 # fromutc() implementation (called by the default astimezone()
121 # implementation) passes a datetime with dt.tzinfo is self.
123 assert dt
.tzinfo
is self
125 # Find first Sunday in April & the last in October.
126 start
= first_sunday_on_or_after(DSTSTART
.replace(year
=dt
.year
))
127 end
= first_sunday_on_or_after(DSTEND
.replace(year
=dt
.year
))
129 # Can't compare naive to aware objects, so strip the timezone from
131 if start
<= dt
.replace(tzinfo
=None) < end
:
136 Eastern
= USTimeZone(-5, "Eastern", "EST", "EDT")
137 Central
= USTimeZone(-6, "Central", "CST", "CDT")
138 Mountain
= USTimeZone(-7, "Mountain", "MST", "MDT")
139 Pacific
= USTimeZone(-8, "Pacific", "PST", "PDT")