Skip to content

Commit 1393d06

Browse files
committed
Fixes timezone behavior when passed to a datetime constructor.
1 parent 908b5fe commit 1393d06

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

pendulum/tz/timezone.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

tests/tz_tests/test_timezone.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,15 @@ def test_tzname_fold_attribute_is_honored(self):
256256
name = tz.tzname(dt.replace(fold=1))
257257

258258
self.assertEqual('EST', name)
259+
260+
def test_constructor_fold_attribute_is_honored(self):
261+
self.skip_if_not_36()
262+
263+
tz = pendulum.timezone('US/Eastern')
264+
dt = datetime(2014, 11, 2, 1, 30, tzinfo=tz)
265+
266+
self.assertEqual('-0400', dt.strftime('%z'))
267+
268+
dt = datetime(2014, 11, 2, 1, 30, tzinfo=tz, fold=1)
269+
270+
self.assertEqual('-0500', dt.strftime('%z'))

0 commit comments

Comments
 (0)