Kaydet (Commit) f4c0eec7 authored tarafından Jinank Jain's avatar Jinank Jain Kaydeden (comit) Claude Paroz

Fixed #27699 -- Added negative timedelta support to parse_duration()

üst 8ade277a
...@@ -30,9 +30,9 @@ datetime_re = re.compile( ...@@ -30,9 +30,9 @@ datetime_re = re.compile(
standard_duration_re = re.compile( standard_duration_re = re.compile(
r'^' r'^'
r'(?:(?P<days>-?\d+) (days?, )?)?' r'(?:(?P<days>-?\d+) (days?, )?)?'
r'((?:(?P<hours>\d+):)(?=\d+:\d+))?' r'((?:(?P<hours>-?\d+):)(?=\d+:\d+))?'
r'(?:(?P<minutes>\d+):)?' r'(?:(?P<minutes>-?\d+):)?'
r'(?P<seconds>\d+)' r'(?P<seconds>-?\d+)'
r'(?:\.(?P<microseconds>\d{1,6})\d{0,6})?' r'(?:\.(?P<microseconds>\d{1,6})\d{0,6})?'
r'$' r'$'
) )
...@@ -125,5 +125,7 @@ def parse_duration(value): ...@@ -125,5 +125,7 @@ def parse_duration(value):
sign = -1 if kw.pop('sign', '+') == '-' else 1 sign = -1 if kw.pop('sign', '+') == '-' else 1
if kw.get('microseconds'): if kw.get('microseconds'):
kw['microseconds'] = kw['microseconds'].ljust(6, '0') kw['microseconds'] = kw['microseconds'].ljust(6, '0')
if kw.get('seconds') and kw.get('microseconds') and kw['seconds'].startswith('-'):
kw['microseconds'] = '-' + kw['microseconds']
kw = {k: float(v) for k, v in six.iteritems(kw) if v is not None} kw = {k: float(v) for k, v in six.iteritems(kw) if v is not None}
return sign * datetime.timedelta(**kw) return sign * datetime.timedelta(**kw)
...@@ -108,6 +108,10 @@ class DurationParseTests(unittest.TestCase): ...@@ -108,6 +108,10 @@ class DurationParseTests(unittest.TestCase):
def test_negative(self): def test_negative(self):
self.assertEqual(parse_duration('-4 15:30'), timedelta(days=-4, minutes=15, seconds=30)) self.assertEqual(parse_duration('-4 15:30'), timedelta(days=-4, minutes=15, seconds=30))
self.assertEqual(parse_duration('-172800'), timedelta(days=-2))
self.assertEqual(parse_duration('-15:30'), timedelta(minutes=-15, seconds=30))
self.assertEqual(parse_duration('-1:15:30'), timedelta(hours=-1, minutes=15, seconds=30))
self.assertEqual(parse_duration('-30.1'), timedelta(seconds=-30, milliseconds=-100))
def test_iso_8601(self): def test_iso_8601(self):
self.assertIsNone(parse_duration('P4Y')) self.assertIsNone(parse_duration('P4Y'))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment