-rw-r--r-- | core/pim/datebook/datebookweek.cpp | 162 |
1 files changed, 92 insertions, 70 deletions
diff --git a/core/pim/datebook/datebookweek.cpp b/core/pim/datebook/datebookweek.cpp index ce0b10b..8caa827 100644 --- a/core/pim/datebook/datebookweek.cpp +++ b/core/pim/datebook/datebookweek.cpp @@ -576,112 +576,134 @@ void DateBookWeek::slotClockChanged( bool ap ) } // return the date at the beginning of the week... QDate DateBookWeek::weekDate() const { QDate d=bdate; // Calculate offset to first day of week. int dayoffset=d.dayOfWeek(); if(bStartOnMonday) dayoffset--; else if( dayoffset == 7 ) dayoffset = 0; return d.addDays(-dayoffset); } -// this used to only be needed by datebook.cpp, but now we need it inside -// week view since -// we need to be able to figure out our total number of weeks on the fly... -// this is probably the best place to put it.. +// This used to only be needed by datebook.cpp, but now we need it +// inside week view since we need to be able to figure out our total +// number of weeks on the fly. This is probably the best place to put +// it. // For Weeks that start on Monday... (EASY!) -// At the moment we will use ISO 8601 method for computing -// the week. Granted, other countries use other methods, -// bet we aren't doing any Locale stuff at the moment. So, -// this should pass. This Algorithim is public domain and -// available at: +// At the moment we will use the ISO 8601 method for computing the week. +// Granted, other countries use other methods, but we aren't doing any +// Locale stuff at the moment. Without locale info it is too hard to +// guess what method should be used. So, this should pass. This +// algorithim is public domain and available at: // http://personal.ecu.edu/mccartyr/ISOwdALG.txt -// the week number is return, and the year number is returned in year +// the week number is returned, and the year number is returned in year // for Instance 2001/12/31 is actually the first week in 2002. -// There is a more mathematical definition, but I will implement it when -// we are pass our deadline. +// There is a more mathematical definition, it should be implemented. // For Weeks that start on Sunday... (ahh... home rolled) -// okay, if Jan 1 is on Friday or Saturday, -// it will go to the pervious -// week... - +// okay, if Jan 1 is on Friday or Saturday, it will go to the previous +// week. + +/*! + * The week number and year number of a date may actually be different + * then the date itself as specified by the ISO 8601 standard. For + * example if Jan 1 year falls on a Friday, the week number will + * be the last week number for the previous year (52 of year - 1). Another + * example is that the date 2001-12-31 falls on a Monday, its week number + * is 1 and its year is 2002. This function provides stripped down + * version of the alogrithm described in + * http://personal.ecu.edu/mccartyr/ISOwdALG.txt to provide the correct + * week number and year number for a given date. + * + * \param d The date that you want to know the week number for. + * \param week A reference to the variable you want to store the week + * number in. + * \param year A reference to the variable you want to store the year + * number in. + * \param startOnMonday Inform the function whether weeks start on + * Sunday or Monday. Set to true if your weeks start on Monday. + * \return false if the supplied date is invalid, true otherwise. + */ bool calcWeek( const QDate &d, int &week, int &year, bool startOnMonday ) { - int weekNumber; - int yearNumber; + int weekNumber = -1; + int yearNumber = -1; - // remove a pesky warning, (Optimizations on g++) - weekNumber = -1; int jan1WeekDay = QDate(d.year(), 1, 1).dayOfWeek(); int dayOfWeek = d.dayOfWeek(); if ( !d.isValid() ) - return false; + return false; if ( startOnMonday ) { - // find the Jan1Weekday; - if ( d.dayOfYear() <= ( 8 - jan1WeekDay) && jan1WeekDay > 4 ) { - yearNumber = d.year() - 1; - if ( jan1WeekDay == 5 || ( jan1WeekDay == 6 && QDate::leapYear(yearNumber) ) ) - weekNumber = 53; - else - weekNumber = 52; - } else - yearNumber = d.year(); - if ( yearNumber == d.year() ) { - int totalDays = 365; - if ( QDate::leapYear(yearNumber) ) - totalDays++; - if ( ((totalDays - d.dayOfYear()) < (4 - dayOfWeek) ) - || (jan1WeekDay == 7) && (totalDays - d.dayOfYear()) < 3) { - yearNumber++; - weekNumber = 1; + // find the Jan1Weekday; + if ( d.dayOfYear() <= ( 8 - jan1WeekDay) && jan1WeekDay > 4 ) { + yearNumber = d.year() - 1; + if ( jan1WeekDay == 5 + || ( jan1WeekDay == 6 && QDate::leapYear(yearNumber) ) ) + weekNumber = 53; + else + weekNumber = 52; + } else + yearNumber = d.year(); + + if ( yearNumber == d.year() ) { + int totalDays = 365; + if ( QDate::leapYear(yearNumber) ) + totalDays++; + if ( ((totalDays - d.dayOfYear()) < (4 - dayOfWeek) ) + || (jan1WeekDay == 7) && (totalDays - d.dayOfYear()) < 3) + { + yearNumber++; + weekNumber = 1; + } + } + if ( yearNumber == d.year() ) { + int j = d.dayOfYear() + (7 - dayOfWeek) + ( jan1WeekDay - 1 ); + weekNumber = j / 7; + if ( jan1WeekDay > 4 ) + weekNumber--; } - } - if ( yearNumber == d.year() ) { - int j = d.dayOfYear() + (7 - dayOfWeek) + ( jan1WeekDay - 1 ); - weekNumber = j / 7; - if ( jan1WeekDay > 4 ) - weekNumber--; - } } else { - // it's better to keep these cases separate... - if ( d.dayOfYear() <= (7 - jan1WeekDay) && jan1WeekDay > 4 - && jan1WeekDay != 7 ) { - yearNumber = d.year() - 1; - if ( jan1WeekDay == 6 - || (jan1WeekDay == 7 && QDate::leapYear(yearNumber) ) ) { - weekNumber = 53; - }else - weekNumber = 52; - } else - yearNumber = d.year(); - if ( yearNumber == d.year() ) { - int totalDays = 365; - if ( QDate::leapYear( yearNumber ) ) - totalDays++; - if ( ((totalDays - d.dayOfYear()) < (4 - dayOfWeek % 7)) ) { - yearNumber++; - weekNumber = 1; + // it's better to keep these cases separate... + if ( d.dayOfYear() <= (7 - jan1WeekDay) && jan1WeekDay > 4 + && jan1WeekDay != 7 ) + { + yearNumber = d.year() - 1; + if ( jan1WeekDay == 6 + || (jan1WeekDay == 7 && QDate::leapYear(yearNumber) ) ) + { + weekNumber = 53; + } else + weekNumber = 52; + } else + yearNumber = d.year(); + + if ( yearNumber == d.year() ) { + int totalDays = 365; + if ( QDate::leapYear( yearNumber ) ) + totalDays++; + if ( ((totalDays - d.dayOfYear()) < (4 - dayOfWeek % 7)) ) { + yearNumber++; + weekNumber = 1; + } } - } - if ( yearNumber == d.year() ) { - int j = d.dayOfYear() + (7 - dayOfWeek % 7) + ( jan1WeekDay - 1 ); - weekNumber = j / 7; - if ( jan1WeekDay > 4 ) { - weekNumber--; + if ( yearNumber == d.year() ) { + int j = d.dayOfYear() + (7 - dayOfWeek % 7) + ( jan1WeekDay - 1 ); + weekNumber = j / 7; + + if ( jan1WeekDay > 4 ) + weekNumber--; } } - } year = yearNumber; week = weekNumber; return true; } |