summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstarryrbs <1322096624@qq.com>2020-12-19 17:53:35 +0800
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-12-21 10:28:07 +0100
commit2a76f4313423a3b91caade4fce71790630ef9152 (patch)
tree591d0303011cb8d5f97d33a96b62663d9d4ea14d
parent57d05f94c36fd88378e94470e13d1e1dc935748a (diff)
Fixed #32269 -- Fixed parse_duration() for negative days in ISO 8601 format.
-rw-r--r--django/utils/dateparse.py2
-rw-r--r--tests/utils_tests/test_dateparse.py4
2 files changed, 6 insertions, 0 deletions
diff --git a/django/utils/dateparse.py b/django/utils/dateparse.py
index 0945c0c761..e069f5df39 100644
--- a/django/utils/dateparse.py
+++ b/django/utils/dateparse.py
@@ -144,4 +144,6 @@ def parse_duration(value):
kw['microseconds'] = '-' + kw['microseconds']
kw = {k: float(v.replace(',', '.')) for k, v in kw.items() if v is not None}
days = datetime.timedelta(kw.pop('days', .0) or .0)
+ if match.re == iso8601_duration_re:
+ days *= sign
return days + sign * datetime.timedelta(**kw)
diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py
index 59dcab6b1c..0ecbe24847 100644
--- a/tests/utils_tests/test_dateparse.py
+++ b/tests/utils_tests/test_dateparse.py
@@ -135,8 +135,11 @@ class DurationParseTests(unittest.TestCase):
('P4M', None),
('P4W', None),
('P4D', timedelta(days=4)),
+ ('-P1D', timedelta(days=-1)),
('P0.5D', timedelta(hours=12)),
('P0,5D', timedelta(hours=12)),
+ ('-P0.5D', timedelta(hours=-12)),
+ ('-P0,5D', timedelta(hours=-12)),
('PT5H', timedelta(hours=5)),
('-PT5H', timedelta(hours=-5)),
('PT5M', timedelta(minutes=5)),
@@ -147,6 +150,7 @@ class DurationParseTests(unittest.TestCase):
('PT0,000005S', timedelta(microseconds=5)),
('-PT0.000005S', timedelta(microseconds=-5)),
('-PT0,000005S', timedelta(microseconds=-5)),
+ ('-P4DT1H', timedelta(days=-4, hours=-1)),
)
for source, expected in test_values:
with self.subTest(source=source):