metomi/isodatetime

Use of TimePoint in parsing datetime-like duration format

MetRonnie opened this issue · 1 comments

When using the datetime-like duration format, e.g. P0004-03-10 for P4Y3M10D, but without specifying the month or the day of month, it sets the month and day to 1

from metomi.isodatetime.parsers import DurationParser
parser = DurationParser()
print(parser.parse('P0004'))
# P4Y1M1D

This is because DurationParser.parse() parses the duration (without the P at the start) as a TimePoint, and TimePoint automatically sets the date to 1st Jan if the month & day are not specified

Relevant LOC:

try:
timepoint = parse_timepoint_expression(
expression[1:],
# this is a duration but we are parsing it as a timepoint
# so don't validate.
validate=False,
allow_truncated=False,
assumed_time_zone=(0, 0)
)
except ISO8601SyntaxError:
raise ISO8601SyntaxError("duration", expression)
if timepoint.get_is_week_date():
raise ISO8601SyntaxError("duration", expression)
result_map = {}
result_map["years"] = timepoint.year
if timepoint.get_is_calendar_date():
result_map["months"] = timepoint.month_of_year
result_map["days"] = timepoint.day_of_month
if timepoint.get_is_ordinal_date():
result_map["days"] = timepoint.day_of_year
result_map["hours"] = timepoint.hour_of_day
if timepoint.minute_of_hour is not None:
result_map["minutes"] = timepoint.minute_of_hour
if timepoint.second_of_minute is not None:
result_map["seconds"] = timepoint.second_of_minute
return data.Duration(**result_map)

def parse_timepoint_expression(timepoint_expression, validate=True, **kwargs):
"""Return a data model that represents timepoint_expression."""
parser = TimePointParser(**kwargs)
return parser.parse(timepoint_expression, validate=validate)