44from datetime import datetime
55
66from .loader import Loader
7- from .timezone_info import TimezoneInfo
7+ from .timezone_info import TimezoneInfo , UTC
88from .breakdown import local_time as _local_time
99from .transition_type import TransitionType
1010
@@ -73,6 +73,9 @@ def convert(self, dt):
7373 else :
7474 converted = self ._convert (dt )
7575
76+ if not isinstance (converted , tuple ):
77+ return converted
78+
7679 return dt .__class__ (* converted )
7780
7881 def _normalize (self , dt ):
@@ -95,7 +98,6 @@ def _normalize(self, dt):
9598 # Find the first transition after our target date/time
9699 begin = self ._transitions [0 ]
97100 end = self ._transitions [- 1 ]
98- offset = None
99101
100102 if dt < begin .time :
101103 tr = begin
@@ -118,6 +120,10 @@ def _normalize(self, dt):
118120 # Before first transition, so use the default offset.
119121 offset = self ._default_transition_type .utc_offset
120122 unix_time = (dt - datetime (1970 , 1 , 1 )).total_seconds () - offset
123+
124+ return self ._to_local_time (
125+ unix_time , self ._default_transition_type
126+ )
121127 else :
122128 # tr.pre_time < dt < tr.time
123129 # Skipped time
@@ -152,7 +158,7 @@ def _normalize(self, dt):
152158
153159 transition_type = tr .pre_transition_type
154160
155- return self ._to_local_time (unix_time , transition_type , offset )
161+ return self ._to_local_time (unix_time , transition_type )
156162
157163 def _convert (self , dt ):
158164 """
@@ -173,23 +179,21 @@ def _convert(self, dt):
173179 if not self ._transitions :
174180 transition_type = self ._default_transition_type
175181 else :
176- idx = max (0 , self ._find_transition_index (unix_time ) - 1 )
182+ idx = max (0 , self ._find_transition_index (unix_time , '_unix_time' ) - 1 )
177183 tr = self ._transitions [idx ]
178184 transition_type = tr .transition_type
179185
180186 return self ._to_local_time (unix_time , transition_type )
181187
182- def _to_local_time (self , unix_time , transition_type , offset = None ):
188+ def _to_local_time (self , unix_time , transition_type ):
183189 local_time = _local_time (
184190 unix_time ,
185191 transition_type
186192 )
187193
188194 tzinfo = TimezoneInfo (
189195 self ,
190- offset if offset is not None else transition_type .utc_offset ,
191- transition_type .is_dst ,
192- transition_type .abbrev
196+ transition_type
193197 )
194198
195199 return local_time [:7 ] + (tzinfo ,)
@@ -211,13 +215,9 @@ def _get_timestamp(self, dt):
211215
212216 return t
213217
214- def _find_transition_index (self , dt ):
218+ def _find_transition_index (self , dt , prop = '_time' ):
215219 lo , hi = 0 , len (self ._transitions )
216220
217- prop = '_time'
218- if isinstance (dt , (int , float )):
219- prop = '_unix_time'
220-
221221 while lo < hi :
222222 mid = (lo + hi ) // 2
223223 if dt < getattr (self ._transitions [mid ], prop ):
@@ -258,11 +258,11 @@ class _UTC(Timezone):
258258 def __init__ (self ):
259259 super (_UTC , self ).__init__ ('UTC' , [], [], TransitionType (0 , False , 'GMT' ))
260260
261- self ._tzinfo = TimezoneInfo (self , 0 , False , 'UTC' )
261+ UTC ._tz = self
262+ self ._tzinfo = UTC
262263
263264 @property
264265 def tzinfo (self ):
265266 return self ._tzinfo
266267
267268UTCTimezone = _UTC ()
268- UTC = UTCTimezone .tzinfo
0 commit comments