The International Standards Organization defines that a week starts on a Monday (day 1) and that the first week of a year
is the one that includes the first Thursday of that year. A year can have 52 or
53 ISO weeks.
In tip 7047, I scripted Day.bat to determine the day of a given date.
Using Day.bat, I have scripted Week.bat to determine the ISO Year, ISO Week, and ISO Day of a given date. The syntax for using Week.bat is:
Call Week Year Month Day ISOYear ISOWeek ISODay
where:
Year is the 4 digit year of the date you wish to convert, Month is the 1 or 2 digit month of Year, Day is the 1 or 2 digit day of Month, ISOYear is a call directed environment variable that will contain the 4 digit ISO Year, ISOWeek is a call directed environment variable that will contain the 2 digit ISO Week, ISODay is a call directed environment variable that will contain the 2 digit ISO Day.NOTE: Week.bat and Day.bat were modified on 24-Aug-2003 to fix a century problem.
Week.bat contains:
@echo off if \{%6\}==\{\} @echo Syntax: Call week yyyy mm dd isoyear isoweek isoday&goto :EOF setlocal :: Week beginning date based upon 01/01 day :: M T W T F S S set /a century=1 set /a century4=1 set mdt=0001313029040302 set /a yyyy=%1 set mma=%2 set dda=%3 set /a mm=100%2%%100 set /a dd=100%3%%100 if %mm% LSS 10 set mma=0%mm% if %dd% LSS 10 set dda=0%dd% set dt=%yyyy%%mma%%dda% call day %yyyy% %mma% %dda% weekday dayname set /a year=%yyyy% call :W1 if "%dt%" LSS "%w1date%" goto prevyear set offset=000000031059090120151181212243273304334 set /a leapyear=%year%%%4 if %leapyear% EQU 0 set offset=000000031060091121152182213244274305335 set /a off=%mm% * 3 call set monoff=%%offset:~%off%,3%% set /a monoff=1000%monoff%%%1000 set /a off=%monoff% + %dd% set /a off=%off% - %minus% set /a week=%off% / 7 set /a week=%week% + 1 if %leapyear% EQU 0 set /a century=%yyyy%%%100 if %century% EQU 0 set /a century4=%yyyy%%%400 if %century% EQU 0 if %century4% NEQ 0 if %mm% GEQ 3 if %weekday% EQU 7 set /a week=%week% - 1 if %week% lss 10 set week=0%week% if %week% GTR 52 goto nextyear endlocal&set %4=%yyyy%&set %5=%week%&set %6=%weekday% goto :EOF :W1 call day %year% 01 01 daynumb dayname set /a offset=%daynumb% * 2 call set w1mon=%%mdt:~%offset%,2%% set w1date=%year%01%w1mon% if "%w1mon%" GTR "04" goto :W2 set /a minus=100%w1mon%%%100 goto :EOF :W2 set /a lastyear=%year% - 1 set /a minus=%w1mon% - 31 set w1date=%lastyear%12%w1mon% goto :EOF :prevyear set /a year=%yyyy% - 1 call :W1 set /a monoff=365 set /a leapyear=%year%%%4 if %leapyear% EQU 0 set /a monoff=366 set /a off=%monoff% + %dd% set /a off=%off% - %minus% set /a week=%off% / 7 set /a week=%week% + 1 if %leapyear% EQU 0 set /a century=%year%%%100 if %century% EQU 0 set /a century4=%year%%%400 if %century% EQU 0 if %century4% NEQ 0 if %weekday% EQU 7 if %week% EQU 53 set /a week=%week% - 1 endlocal&set %4=%year%&set %5=%week%&set %6=%weekday% goto :EOF :nextyear set /a year=%yyyy% + 1 call :w1 if "%dt%" LSS "%w1date%" endlocal&set %4=%yyyy%&set %5=%week%&set %6=%weekday%&goto :EOF set week=01 endlocal&set %4=%year%&set %5=%week%&set %6=%weekday%NOTE: See tip 7090 » How do I convert an ISO year, week, and day to a calendar date?
0 comments
Hide comments