summaryrefslogtreecommitdiffstats
path: root/Lib/_strptime.py
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2004-10-28 04:49:21 (GMT)
committerBrett Cannon <bcannon@gmail.com>2004-10-28 04:49:21 (GMT)
commit14adbe77b5e9c68fb525d25961c86b5b0dbb1945 (patch)
treeaa9fb068f2eb493c434c8dc599aebcbb96d1f94a /Lib/_strptime.py
parent79d9bfa28f66e031dbc252eabe78cd0aea081f06 (diff)
downloadcpython-14adbe77b5e9c68fb525d25961c86b5b0dbb1945.zip
cpython-14adbe77b5e9c68fb525d25961c86b5b0dbb1945.tar.gz
cpython-14adbe77b5e9c68fb525d25961c86b5b0dbb1945.tar.bz2
Fix bug of implementation of algorithm for calculating the date from year, week
of the year, and day of the week. Was not taking into consideration properly the issue of when %U is used for the week of the year but the year starts on Monday. Closes bug #1045381 again.
Diffstat (limited to 'Lib/_strptime.py')
-rw-r--r--Lib/_strptime.py22
1 files changed, 12 insertions, 10 deletions
diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index 1a6e8a8..a6b54f3 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -391,25 +391,27 @@ def strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
# If we know the week of the year and what day of that week, we can figure
# out the Julian day of the year
# Calculations below assume 0 is a Monday
- if julian == -1 and week_of_year != -1 and weekday != -1 and year != -1:
- # Adjust for U directive so that calculations are not dependent on
- # directive used to figure out week of year
- if weekday == 6 and week_of_year_start == 6:
- week_of_year -= 1
- # For some reason when Dec 31 falls on a Monday the week of the year is
- # off by a week; verified on both OS X and Solaris.
- elif weekday == 0 and week_of_year_start == 6 and week_of_year >= 52:
- week_of_year += 1
+ if julian == -1 and week_of_year != -1 and weekday != -1:
# Calculate how many days in week 0
first_weekday = datetime_date(year, 1, 1).weekday()
preceeding_days = 7 - first_weekday
if preceeding_days == 7:
preceeding_days = 0
+ # Adjust for U directive so that calculations are not dependent on
+ # directive used to figure out week of year
+ if weekday == 6 and week_of_year_start == 6:
+ week_of_year -= 1
+ # If a year starts and ends on a Monday but a week is specified to
+ # start on a Sunday we need to up the week to counter-balance the fact
+ # that with %W that first Monday starts week 1 while with %U that is
+ # week 0 and thus shifts everything by a week
+ if weekday == 0 and first_weekday == 0 and week_of_year_start == 6:
+ week_of_year += 1
# If in week 0, then just figure out how many days from Jan 1 to day of
# week specified, else calculate by multiplying week of year by 7,
# adding in days in week 0, and the number of days from Monday to the
# day of the week
- if not week_of_year:
+ if week_of_year == 0:
julian = 1 + weekday - first_weekday
else:
days_to_week = preceeding_days + (7 * (week_of_year - 1))