## ISO Week Numbering

The ISO week date system is a leap week calendar system that is part of the ISO 8601 date and time standard. The system is used (mainly) in government and business for fiscal years, as well as in timekeeping.

This script is an example of how to calculate the week number for any given date.

```//  ISO Week Numbering

/*
Tony Goodman
*/

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 = {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")
```