@@ -175,7 +175,8 @@ def _normalize(self, dt, dst_rule=None):
175175 unix_time = (dt - datetime (1970 , 1 , 1 )).total_seconds () - offset
176176
177177 return self ._to_local_time (
178- unix_time , self ._default_tzinfo_index
178+ unix_time , dt .microsecond , self ._default_tzinfo_index ,
179+ fold
179180 )
180181 else :
181182 # tr.pre_time < dt < tr.time
@@ -316,51 +317,60 @@ def _find_transition_index(self, dt, prop='_time'):
316317 return lo
317318
318319 def _get_previous_transition_time (self , tr , dt ):
320+ """
321+ Returns the time before the transition
322+ as a (unix_time, tzinfo_index) tuple.
323+
324+ :param tr: The transition
325+ :type tr: Transition
326+
327+ :param dt: The datetime
328+ :type dt: datetime
329+
330+ :rtype: tuple
331+ """
319332 diff = self ._get_diff (tr .pre_time , dt )
320333 if - 1 < diff < 0 and tr .unix_time < 0 :
321334 diff -= 1
322335
323- unix_time = tr .unix_time + diff
324-
325336 tzinfo_index = tr .pre_tzinfo_index
326337
338+ unix_time = tr .unix_time + diff
339+
327340 return unix_time , tzinfo_index
328341
329342 def tzname (self , dt ):
330343 if dt is None :
331344 return None
332345
333- tzinfo = dt .tzinfo
334- if tzinfo is None or tzinfo .tz is not self :
346+ if dt .tzinfo is self :
347+ dt = self .convert (dt .replace (tzinfo = None ))
348+ else :
335349 dt = self .convert (dt )
336350
337- return dt .tzinfo .abbrev
338-
339- return dt .tzinfo .tzname (dt )
351+ return dt .tzinfo .abbrev
340352
341353 def utcoffset (self , dt ):
342354 if dt is None :
343355 return None
344356
345- tzinfo = dt .tzinfo
346- if tzinfo is None or tzinfo .tz is not self :
357+ if dt .tzinfo is self :
358+ dt = self .convert (dt .replace (tzinfo = None ))
359+ else :
347360 dt = self .convert (dt )
348361
349- return dt .tzinfo .adjusted_offset
350-
351- return dt .tzinfo .utcoffset (dt )
362+ return dt .tzinfo .adjusted_offset
352363
353364 def dst (self , dt ):
354365 if dt is None :
355366 return None
356367
357- tzinfo = dt .tzinfo
358- if tzinfo is None or tzinfo .tz is not self :
368+ if dt .tzinfo is self :
369+ dt = self .convert (dt .replace (tzinfo = None ))
370+ else :
359371 dt = self .convert (dt )
360372
361- return dt .tzinfo .dst_
362-
363- return dt .tzinfo .dst (dt )
373+ return dt .tzinfo .dst_
364374
365375 def fromutc (self , dt ):
366376 dt = dt .replace (tzinfo = None )
0 commit comments