From 9a135d017792b9f5ff87a0f916dc5eb65f51ec47 Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Wed, 1 Nov 2017 13:34:29 -0400 Subject: Add fix for ordinal dates --- dateutil/parser/isoparser.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'dateutil/parser') diff --git a/dateutil/parser/isoparser.py b/dateutil/parser/isoparser.py index 330ae5d..074aef2 100644 --- a/dateutil/parser/isoparser.py +++ b/dateutil/parser/isoparser.py @@ -206,6 +206,9 @@ class Isoparser(object): pos += 1 # Month + if len_str - pos < 2: + raise ValueError('Invalid common month') + components[1] = int(dt_str[pos:pos + 2]) pos += 2 @@ -218,6 +221,8 @@ class Isoparser(object): pos += 1 # Day + if len_str - pos < 2: + raise ValueError('Invalid common day') components[2] = int(dt_str[pos:pos + 2]) return components, pos + 2 @@ -240,11 +245,11 @@ class Isoparser(object): # All other uncommon ISO formats start with the year year = int(dt_str[0:4]) - pos = 4 + dt_str[4] == '-' # Skip '-' if it's there + pos = 4 + (dt_str[4] == '-') # Skip '-' if it's there if dt_str[pos] == 'W': # YYYY-?Www-?D? pos += 1 - weekno = dt_str[pos:pos + 2] + weekno = int(dt_str[pos:pos + 2]) pos += 2 dayno = 1 @@ -255,7 +260,7 @@ class Isoparser(object): raise ValueError('Inconsistent use of dash separator') pos += 1 - dayno = dt_str[pos] + dayno = int(dt_str[pos]) pos += 1 base_date = self._calculate_weekdate(year, weekno, dayno) @@ -264,11 +269,11 @@ class Isoparser(object): ordinal_day = int(dt_str[pos:pos + 3]) pos += 3 - if ordinal_day > 365 + calendar.isleap(year): + if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): raise ValueError('Invalid ordinal day' + ' {} for year {}'.format(ordinal_day, year)) - base_date = date(year, 1, 1) + timedelta(days=ordinal_day) + base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) components = [base_date.year, base_date.month, base_date.day] return components, pos -- cgit v1.2.1