summaryrefslogtreecommitdiff
path: root/dateutil/parser
diff options
context:
space:
mode:
authorPaul Ganssle <paul@ganssle.io>2017-11-01 13:34:29 -0400
committerPaul Ganssle <paul@ganssle.io>2017-12-06 12:43:56 +0000
commit9a135d017792b9f5ff87a0f916dc5eb65f51ec47 (patch)
treeff5ee1c465a9e3ac617cafbbfd420a51017352ce /dateutil/parser
parentfbe9db9714a05568a391ab1c7a80a7c8044998b5 (diff)
downloaddateutil-git-9a135d017792b9f5ff87a0f916dc5eb65f51ec47.tar.gz
Add fix for ordinal dates
Diffstat (limited to 'dateutil/parser')
-rw-r--r--dateutil/parser/isoparser.py15
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