// /* */ int dayNumber(string day) { // return the number of the day (starting from 1, not zero) string days[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" } int i = 0 for (i = 0; i < sizeof(days); i++) { if (day == days[i]) break } return(i + 1) } bool isLeapYear(int yyyy) { // return true if the given year is a leap year if (yyyy % 4 != 0) { return(false) } if (yyyy %100 != 0) { return(true) } if (yyyy % 400 != 0) { return(false) } return(true) } bool yearHas53Weeks(int yyyy) { // normal years starting on a thursday and leap years starting on a Wednesday have 53 weeks Date firstJan = null string firstJanDay = "" firstJan = "01 January " (yyyy) "" firstJanDay = stringOf(firstJan, "dddd") // normal years starting on a thursday and leap years starting on a Wednesday have 53 weeks if ((isLeapYear(yyyy) && firstJanDay == "Wednesday") || (firstJanDay == "Thursday")) { return(true) } return(false) } void getISOWeekNumber(Date dt, int &week, int &year) { // number of days in preceeding months jan - dec int months[13] = {0,31,59,90,120,151,181,212,243,273,304,334}; // extract day month and year as integers string dateString = stringOf(dt, "ddMMyyyy") string weekDay = stringOf(dt, "dddd") int dd = intOf(dateString[0:1]) int mm = intOf(dateString[2:3]) int yyyy = intOf(dateString[4:7]) // ordinal position of day in the year int ordinal = dd + months[mm - 1] // correction for leap years if (isLeapYear(yyyy) && ordinal >= 59) { ordinal += 1 } // calculate ISO week number week = (ordinal - dayNumber(weekDay) + 10) / 7 // set return value. this may change later year = yyyy if (week == 0) { // this week is in the previous year, maybe 52 or 53 year = yyyy - 1 if (yearHas53Weeks(yyyy - 1)) { week = 53 } else { // all other years have 52 weeks week = 52 } } else if (week == 53) { // this is either week 53 of the current year, or week 1 of the following year if (yearHas53Weeks(yyyy)) { week = 53 } else { // the year has 52 weeks, so the day is in the first week of the following year week = 1 year = yyyy + 1 } } } int week = 0 int year = 0 Date d = "01 January 2005" getISOWeekNumber(d, week, year) print(year " " week "\n")