Skip to content

Commit 1ec1ad0

Browse files
committed
Fix an error when adding an interval to a pendulum instance across DST transition
1 parent d479c93 commit 1ec1ad0

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

pendulum/datetime.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ def _add_timedelta(self, delta):
578578
579579
:rtype: DateTime
580580
"""
581-
if isinstance(delta, pendulum.Duration):
581+
if isinstance(delta, pendulum.Period):
582582
return self.add(
583583
years=delta.years,
584584
months=delta.months,
@@ -589,9 +589,14 @@ def _add_timedelta(self, delta):
589589
seconds=delta.remaining_seconds,
590590
microseconds=delta.microseconds
591591
)
592+
elif isinstance(delta, pendulum.Duration):
593+
return self.add(
594+
years=delta.years,
595+
months=delta.months,
596+
seconds=delta.total_seconds()
597+
)
592598

593-
return self.add(days=delta.days, seconds=delta.seconds,
594-
microseconds=delta.microseconds)
599+
return self.add(seconds=delta.total_seconds())
595600

596601
def _subtract_timedelta(self, delta):
597602
"""

pendulum/duration.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ def __new__(cls, days=0, seconds=0, microseconds=0,
6464
self._microseconds = round(total % m * 1e6)
6565
self._seconds = abs(int(total)) % SECONDS_PER_DAY * m
6666

67-
days = abs(int(total)) // SECONDS_PER_DAY * m
68-
self._days = days + (years * 365 + months * 30)
69-
self._remaining_days = abs(days) % 7 * m
70-
self._weeks = abs(days) // 7 * m
67+
_days = abs(int(total)) // SECONDS_PER_DAY * m
68+
self._days = _days + (years * 365 + months * 30)
69+
self._remaining_days = abs(_days) % 7 * m
70+
self._weeks = abs(_days) // 7 * m
7171
self._months = months
7272
self._years = years
7373

tests/datetime/test_add.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,10 @@ def test_add_time_to_new_transition_repeated_big():
248248
assert dt.timezone_name == 'Europe/Paris'
249249
assert dt.offset == 3600
250250
assert not dt.is_dst()
251+
252+
253+
def test_add_interval():
254+
dt = pendulum.datetime(2017, 3, 11, 10, 45, tz='America/Los_Angeles')
255+
new = dt + pendulum.duration(hours=24)
256+
257+
assert_datetime(new, 2017, 3, 12, 11, 45)

0 commit comments

Comments
 (0)