=====Finding the ISO week number=====
//by Richard Russell, November 2015//\\ \\ The code listed below finds the [[https://en.wikipedia.org/wiki/ISO_week_date|ISO week number]] (or year and week) corresponding to a given date:
INSTALL @lib$+"DATELIB"
PRINT FN_ISOweek(1,1,2005)
PRINT FN_ISOweek(2,1,2005)
PRINT FN_ISOweek(31,12,2005)
PRINT FN_ISOweek(31,12,2006)
PRINT FN_ISOweek(1,1,2007)
PRINT FN_ISOweek(30,12,2007)
PRINT FN_ISOweek(31,12,2007)
PRINT FN_ISOweek(1,1,2008)
PRINT FN_ISOweek(28,12,2008)
PRINT FN_ISOweek(29,12,2008)
PRINT FN_ISOweek(30,12,2008)
PRINT FN_ISOweek(31,12,2008)
PRINT FN_ISOweek(1,1,2009)
PRINT FN_ISOweek(31,12,2009)
PRINT FN_ISOweek(1,1,2010)
PRINT FN_ISOweek(2,1,2010)
PRINT FN_ISOweek(3,1,2010)
REM FOR d% = 1 TO 30
REM PRINT d%, FN_ISOweek(d%,11,2015)
REM NEXT
END
DEF FN_ISOweek(day%,month%,year%)
LOCAL iyr%, mjd%
iyr% = year%
mjd% = FN_mjd(day%,month%,iyr%)
IF mjd% >= FN_ISOwk1(iyr%+1) THEN iyr% += 1
IF mjd% < FN_ISOwk1(iyr%) THEN iyr% -= 1
= (mjd% - FN_ISOwk1(iyr%)) DIV 7 + 1
DEF FN_ISOwk1(year%)
LOCAL dow%, mjd%
mjd% = FN_mjd(4,1,year%)
dow% = FN_dow(mjd%)
IF dow% = 0 dow% = 7
= mjd% - dow% + 1
If you want to know the ISO year as well as the week, you can return it in an additional parameter:
DEF FN_ISOweek(day%,month%,year%,RETURN iyr%)
LOCAL mjd%
... remainder as above