{
// adjust the weekdays to non-US style.
wdYearStart = ConvertWeekDayToMondayBase(wdYearStart);
- wdTarget = ConvertWeekDayToMondayBase(wdTarget);
// quoting from http://www.cl.cam.ac.uk/~mgk25/iso-time.html:
//
//
// if Jan 1 is Thursday or less, it is in the first week of this year
- if ( wdYearStart < 4 )
- {
- // count the number of entire weeks between Jan 1 and this date
- week = (nDayInYear + wdYearStart + 6 - wdTarget)/7;
+ int dayCountFix = wdYearStart < 4 ? 6 : -1;
+
+ // count the number of week
+ week = (nDayInYear + wdYearStart + dayCountFix) / DAYS_PER_WEEK;
- // be careful to check for overflow in the next year
- if ( week == 53 && tm.mday - wdTarget > 28 )
- week = 1;
+ // check if we happen to be at the last week of previous year:
+ if ( week == 0 )
+ {
+ week = wxDateTime(31, Dec, GetYear() - 1).GetWeekOfYear();
}
- else // Jan 1 is in the last week of the previous year
+ else if ( week == 53 )
{
- // check if we happen to be at the last week of previous year:
- if ( tm.mon == Jan && tm.mday < 8 - wdYearStart )
- week = wxDateTime(31, Dec, GetYear()-1).GetWeekOfYear();
- else
- week = (nDayInYear + wdYearStart - 1 - wdTarget)/7;
+ int wdYearEnd = (wdYearStart + 364 + IsLeapYear(GetYear()))
+ % DAYS_PER_WEEK;
+
+ // Week 53 only if last day of year is Thursday or later.
+ if ( wdYearEnd < 3 )
+ week = 1;
}
}
{ { 2, wxDateTime::Jan, 2004, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 1, 1, 1, 2 },
{ { 5, wxDateTime::Jan, 2010, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 1, 2, 2, 5 },
{ { 3, wxDateTime::Jan, 2011, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 1, 2, 2, 3 },
+ { { 31, wxDateTime::Dec, 2009, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 53, 5, 5, 365 },
+ { { 31, wxDateTime::Dec, 2012, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 1, 6, 6, 366 },
+ { { 29, wxDateTime::Dec, 2013, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 52, 5, 5, 363 },
+ { { 30, wxDateTime::Dec, 2013, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 1, 6, 5, 364 },
+ { { 31, wxDateTime::Dec, 2013, 0, 0, 0, 0.0, wxDateTime::Inv_WeekDay, 0 }, 1, 6, 5, 365 },
};
for ( size_t n = 0; n < WXSIZEOF(weekNumberTestDates); n++ )