Skip to content

Commit f11571c

Browse files
committed
Handle transition.previous being None
1 parent 19d43e8 commit f11571c

File tree

3 files changed

+17
-8
lines changed

3 files changed

+17
-8
lines changed

pendulum/tz/timezone.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def _normalize(
105105
# We set the fold attribute for later
106106
if dst_rule == POST_TRANSITION:
107107
fold = 1
108-
else:
108+
elif transition.previous is not None:
109109
transition = transition.previous
110110

111111
if transition.is_ambiguous(sec):
@@ -149,7 +149,7 @@ def _convert(self, dt): # type: (datetime) -> datetime
149149
transition = dt.tzinfo._lookup_transition(stamp)
150150
offset = transition.ttype.offset
151151

152-
if stamp < transition.local:
152+
if stamp < transition.local and transition.previous is not None:
153153
if (
154154
transition.previous.is_ambiguous(stamp)
155155
and getattr(dt, "fold", 1) == 0
@@ -161,7 +161,7 @@ def _convert(self, dt): # type: (datetime) -> datetime
161161
stamp -= offset
162162

163163
transition = self._lookup_transition(stamp, is_utc=True)
164-
if stamp < transition.at:
164+
if stamp < transition.at and transition.previous is not None:
165165
transition = transition.previous
166166

167167
offset = transition.ttype.offset
@@ -254,7 +254,7 @@ def _get_transition(self, dt): # type: (datetime) -> Transition
254254

255255
transition = self._lookup_transition(stamp)
256256

257-
if stamp < transition.local:
257+
if stamp < transition.local and transition.previous is not None:
258258
fold = getattr(dt, "fold", 1)
259259
if transition.is_ambiguous(stamp):
260260
if fold == 0:
@@ -270,7 +270,7 @@ def fromutc(self, dt): # type: (datetime) -> datetime
270270
stamp = timestamp(dt)
271271

272272
transition = self._lookup_transition(stamp, is_utc=True)
273-
if stamp < transition.at:
273+
if stamp < transition.at and transition.previous is not None:
274274
transition = transition.previous
275275

276276
stamp += transition.ttype.offset

pendulum/tz/zoneinfo/transition.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import timedelta
2-
from typing import Union
2+
from typing import Union, Optional
33

44
from .transition_type import TransitionType
55

@@ -51,7 +51,7 @@ def ttype(self): # type: () -> TransitionType
5151
return self._ttype
5252

5353
@property
54-
def previous(self): # type: () -> Transition
54+
def previous(self): # type: () -> Optional[Transition]
5555
return self._previous
5656

5757
@property
@@ -67,7 +67,10 @@ def is_missing(self, stamp): # type: (int) -> bool
6767
def utcoffset(self): # type: () -> timedelta
6868
return self._utcoffset
6969

70-
def __contains__(self, stamp): # type: () -> bool
70+
def __contains__(self, stamp): # type: (int) -> bool
71+
if self.previous is None:
72+
return stamp < self.local
73+
7174
return self.previous.local <= stamp < self.local
7275

7376
def __repr__(self): # type: () -> str

tests/tz/test_timezone.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,12 @@ def test_utcoffset():
303303
assert utcoffset == timedelta(0, -18000)
304304

305305

306+
def test_utcoffset_pre_transition():
307+
tz = pendulum.timezone("America/Chicago")
308+
utcoffset = tz.utcoffset(datetime(1883, 11, 18))
309+
assert utcoffset == timedelta(days=-1, seconds=64800)
310+
311+
306312
def test_dst():
307313
tz = pendulum.timezone("Europe/Amsterdam")
308314
dst = tz.dst(datetime(1940, 7, 1))

0 commit comments

Comments
 (0)