summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorF.N. Claessen <felix@seita.nl>2021-02-25 16:15:36 +0100
committerF.N. Claessen <felix@seita.nl>2021-02-25 16:15:36 +0100
commit5c87350f9d1b55e747e19ae11467964023f41e98 (patch)
treec15741ed8c0ef49b7f22aab0f0d118470bbb5e1c
parent27cebc56a0f6a900eeb897512879d545095f410b (diff)
downloadisodate-5c87350f9d1b55e747e19ae11467964023f41e98.tar.gz
Allow control over return type of parse_duration.
-rw-r--r--src/isodate/isoduration.py19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/isodate/isoduration.py b/src/isodate/isoduration.py
index 88829f7..2de4981 100644
--- a/src/isodate/isoduration.py
+++ b/src/isodate/isoduration.py
@@ -51,10 +51,10 @@ ISO8601_PERIOD_REGEX = re.compile(
r"((?P<separator>T)(?P<hours>[0-9]+([,.][0-9]+)?H)?"
r"(?P<minutes>[0-9]+([,.][0-9]+)?M)?"
r"(?P<seconds>[0-9]+([,.][0-9]+)?S)?)?$")
-# regular expression to parse ISO duartion strings.
+# regular expression to parse ISO duration strings.
-def parse_duration(datestring):
+def parse_duration(datestring, as_timedelta_if_possible: bool = True):
"""
Parses an ISO 8601 durations into datetime.timedelta or Duration objects.
@@ -89,17 +89,18 @@ def parse_duration(datestring):
# try alternative format:
if datestring.startswith("P"):
durdt = parse_datetime(datestring[1:])
- if durdt.year != 0 or durdt.month != 0:
+ if as_timedelta_if_possible and durdt.year == 0 and durdt.month == 0:
+ # FIXME: currently not possible in alternative format
+ # create timedelta
+ ret = timedelta(days=durdt.day, seconds=durdt.second,
+ microseconds=durdt.microsecond,
+ minutes=durdt.minute, hours=durdt.hour)
+ else:
# create Duration
ret = Duration(days=durdt.day, seconds=durdt.second,
microseconds=durdt.microsecond,
minutes=durdt.minute, hours=durdt.hour,
months=durdt.month, years=durdt.year)
- else: # FIXME: currently not possible in alternative format
- # create timedelta
- ret = timedelta(days=durdt.day, seconds=durdt.second,
- microseconds=durdt.microsecond,
- minutes=durdt.minute, hours=durdt.hour)
return ret
raise ISO8601Error("Unable to parse duration string %r" % datestring)
groups = match.groupdict()
@@ -114,7 +115,7 @@ def parse_duration(datestring):
# these values are passed into a timedelta object,
# which works with floats.
groups[key] = float(groups[key][:-1].replace(',', '.'))
- if groups["years"] == 0 and groups["months"] == 0:
+ if as_timedelta_if_possible and groups["years"] == 0 and groups["months"] == 0:
ret = timedelta(days=groups["days"], hours=groups["hours"],
minutes=groups["minutes"], seconds=groups["seconds"],
weeks=groups["weeks"])