diff options
| author | Paul Ganssle <paul@ganssle.io> | 2017-11-01 13:34:29 -0400 |
|---|---|---|
| committer | Paul Ganssle <paul@ganssle.io> | 2017-12-06 12:43:56 +0000 |
| commit | 9a135d017792b9f5ff87a0f916dc5eb65f51ec47 (patch) | |
| tree | ff5ee1c465a9e3ac617cafbbfd420a51017352ce /dateutil/parser | |
| parent | fbe9db9714a05568a391ab1c7a80a7c8044998b5 (diff) | |
| download | dateutil-git-9a135d017792b9f5ff87a0f916dc5eb65f51ec47.tar.gz | |
Add fix for ordinal dates
Diffstat (limited to 'dateutil/parser')
| -rw-r--r-- | dateutil/parser/isoparser.py | 15 |
1 files changed, 10 insertions, 5 deletions
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 |
