:: $ISO-YWD.BAT J R Stockton www.merlyn.demon.co.uk >= 2009-09-08 :: Call : $ISO-YWD YYYY MM DD (Note : as is, needs MM DD) :: Call : $ISO-YWD today; adjust code if %date% not YYYY-MM-DD :: March 1900 to February 2100 only :: Testing PROGRAMS/ISO-WKNO.BAT @echo off :: NOW CORRECT :: GET Y M D NUMBERS in ENVIRONMENT XY XM XD : if not %1x==x GOTO THREE set XD=%date% set /a XY= %XD:~0,4% - 1900 set XM=%XD:~5,2% set XD=%XD:~8,2% GOTO INDONE :THREE set /a XY= %1 - 1900 set XM=%2 set XD=%3 :INDONE :: Avoid octal set /a XM= 1%XM% - 100 set /a XD= 1%XD% - 100 :: MAIN PART : :: Zeller year adjust if %XM% LSS 3 ( set /a XM= XM + 12 set /a XY= XY - 1 ) if %XY% LSS 0 ( echo *** DATE TOO SOON *** GOTO ULTIMATE ) :: Daycount, after Zeller, Thu 1900-03-01 = Day 59 ? : set /a ZDAY= XD + (153*XM - 2)/5 + XY*365 + XY/4 - 33 :: ISO Day Number : set /a ZDN= ZDAY %% 7 + 1 :: Nearest Thursday : set /a ZTHU= ZDAY + 4 - ZDN :: ISO Year Number - 1900 : set /a ZYN= (ZTHU*4 + 4) / 1461 :: Jan 1 thereof : set /a ZJAN1= (ZYN*1461 - 1) / 4 :: ISO Week Number : set /a ZWN= (ZTHU-ZJAN1) / 7 + 1 set /a ZYN = 1900 + ZYN :: SET ANSWERS ZYN ZDWN ZDN ZWYWD and DISPLAY : set /a XY= XY+1900 set /a ZWN= ZWN+100 set ZWN=%ZWN:~1,2% set /a XM= XM+100 set XM=%XM:~1,2% set /a XD= XD+100 set XD=%XD:~1,2% set ZYWD=%ZYN%-W%ZWN%-%ZDN% echo %ZYWD% ZDAY=%ZDAY% ZTHU=%ZTHU% ZJAN1=%ZJAN1% %XY%/%XM%/%XD% set ZDAY= set ZTHU= set ZJAN1= GOTO ULTIMATE :VERIFY @echo off set ZCOUNT=0 :LOOP NOWMINUS F1 T1900-03-01 D-%ZCOUNT% L4 QXYYYY B6 L2 QXMM B9 L2 QXDD B0 L10 F5 QXYWD > $$$.BAT CALL $$$.BAT DEL $$$.BAT set XYWD=%XYWD:~0,5%W%XYWD:~5,3%%XYWD:~9,1% call $ISO-YWD %XYYYY% %XMM% %XDD% if %XYWD%==%ZYWD% GOTO OK echo %XYWD% ( known good ) %XYYYY%-%XMM%-%XDD% GOTO ULTIMATE :OK :: Speed up current tests if %XMM% EQU 2 set /a ZCOUNT= ZCOUNT+320 set /a ZCOUNT= ZCOUNT+1 if %ZCOUNT% LSS 10500 GOTO LOOP echo TEST COMPLETE OK set ZCOUNT= set XYWD= set XYYYY= set XMM= set XDD= echo. :ULTIMATE