summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeunghun Lee <waydi1@gmail.com>2019-02-16 16:43:42 +0900
committerTim Graham <timograham@gmail.com>2019-02-23 18:54:09 -0500
commit99fc5dc13c12d874ffc1c8f47a6421494e720b31 (patch)
tree0a1f65ab7898c199ad60a814613579ecf04899a3
parent36300ef336e3f130a0dadc1143163ff3d23dc843 (diff)
Fixed #30141 -- Fixed parse_duration() for some negative durations.
-rw-r--r--django/utils/dateparse.py7
-rw-r--r--tests/utils_tests/test_dateparse.py7
2 files changed, 9 insertions, 5 deletions
diff --git a/django/utils/dateparse.py b/django/utils/dateparse.py
index 8d08b7d1d3..f90d952581 100644
--- a/django/utils/dateparse.py
+++ b/django/utils/dateparse.py
@@ -29,9 +29,10 @@ datetime_re = re.compile(
standard_duration_re = re.compile(
r'^'
r'(?:(?P<days>-?\d+) (days?, )?)?'
- r'((?:(?P<hours>-?\d+):)(?=\d+:\d+))?'
- r'(?:(?P<minutes>-?\d+):)?'
- r'(?P<seconds>-?\d+)'
+ r'(?P<sign>-?)'
+ r'((?:(?P<hours>\d+):)(?=\d+:\d+))?'
+ r'(?:(?P<minutes>\d+):)?'
+ r'(?P<seconds>\d+)'
r'(?:\.(?P<microseconds>\d{1,6})\d{0,6})?'
r'$'
)
diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py
index 8d464278ce..535815c7e2 100644
--- a/tests/utils_tests/test_dateparse.py
+++ b/tests/utils_tests/test_dateparse.py
@@ -113,9 +113,12 @@ class DurationParseTests(unittest.TestCase):
test_values = (
('-4 15:30', timedelta(days=-4, minutes=15, seconds=30)),
('-172800', timedelta(days=-2)),
- ('-15:30', timedelta(minutes=-15, seconds=30)),
- ('-1:15:30', timedelta(hours=-1, minutes=15, seconds=30)),
+ ('-15:30', timedelta(minutes=-15, seconds=-30)),
+ ('-1:15:30', timedelta(hours=-1, minutes=-15, seconds=-30)),
('-30.1', timedelta(seconds=-30, milliseconds=-100)),
+ ('-00:01:01', timedelta(minutes=-1, seconds=-1)),
+ ('-01:01', timedelta(seconds=-61)),
+ ('-01:-01', None),
)
for source, expected in test_values:
with self.subTest(source=source):