Post by sKurtPost by sKurtPost by foxidrive:: datetime.bat V4
:: This uses Windows Scripting Host to set variables
:: to the current date/time/day/day_number
:: for Win9x/ME/NT/W2K/XP etc
:: Thanks go to Todd Vargo for his scripting
Now if you could make this work with the Day of the Year number, I
would be in heaven ;)
i.e.
01/01/2007 = DAY OF YEAR = 1
12/31/2007 = DAY OF YEAR = 31
oops, I meant
12/31/2007 = DAY OF YEAR 365
--
----- batch begins -------
[1]::days.bat
[2]:: de luxe version to accomodate XP 'date/t' breakages
[3]:: NT/2K/XP required
[4]:: version 3.02
[5]:: set dd, mm, yy, yyyy, yyyymmdd to today - n
[6]:: dow to day-of-week (1=Sun..7=Sat)
[7]:: doy to day-of-year (1..365 or 366)
[8]:: julian as yyddd (numeric - leading-zero suppressed)
[9]:: julian_text as yyddd (with leading 0 padding to 5 characters)
[10]:: ibm_julian as yyyyddd
[11]:: since as days since 01/01/1901
[12]:: dayname as name of day
[13]:: day as 3-character abbreviation thereof
[14]:: dd, mm, yy in leading-zero-filled format
[15]:: first parameter is number of days, n - default is 1
[16]:: second parameter is date - default is today
[17]
[18]@echo off
[19]for %%u in (dd mm yy yyyy) do set %%u=
[20]set daysoff=%1
[21]if not defined daysoff set daysoff=1
[22]set zt$=echo %2
[23]if "%2"=="" set zt$=date/t
[24]for /f "tokens=1,2,3,4 delims=/-. " %%w in ('%zt$%') do call :getdate
%%w %%x %%y %%z
[25]::dd,mm - suppress leading zero
[26]set /a dd=1%dd% - 100
[27]set /a mm=1%mm% - 100
[28]:negloop
[29]if /i %daysoff%==0 goto final
[30]if %daysoff% LSS 0 set /a yyyy=%yyyy%+4&set/a
daysoff=%daysoff%+1461&goto negloop
[31]set /a daysoff=daysoff - 1
[32]
[33]:SET30
[34]set /A dd=%dd% - 1
[35]if %dd% GTR 0 goto DONE
[36]:: else last day of month - assume 31
[37]set dd=31
[38]set /A mm=%mm% - 1
[39]if %mm% GTR 0 goto SETDAY
[40]:: Must be Dec. 31st
[41]set /A mm=12
[42]set /A yyyy=%yyyy% - 1
[43]goto DONE
[44]
[45]:SETDAY
[46]::Problem months are Feb, Apr,Jun,Sep and Nov
[47]if %mm%==4 goto SET30
[48]if %mm%==6 goto SET30
[49]if %mm%==9 goto SET30
[50]if %mm%==11 goto SET30
[51]if not %mm%==2 goto DONE
[52]:: February - default to 28 days (exception for leap years)
[53]set /A dd=%yyyy% %% 4
[54]if not %dd%==0 goto set28
[55]set /A dd=%yyyy% %% 100
[56]if not %dd%==0 goto set29
[57]set /A dd=%yyyy% %% 400
[58]if not %dd%==0 goto set28
[59]
[60]:set29
[61]set dd=29
[62]goto done
[63]
[64]:SET28
[65]set dd=28
[66]
[67]:DONE
[68]if /i %daysoff%==0 goto final
[69]if %dd% GTR %daysoff% goto thismonth
[70]set /a daysoff=%daysoff% - %dd%
[71]set dd=1
[72]goto set30
[73]
[74]:thismonth
[75]set /a dd=%dd% - %daysoff%
[76]
[77]:final
[78]:: now convert back to 2-digit dd, mm and yy
[79]if %mm% LSS 10 set mm=0%mm%
[80]if %dd% LSS 10 set dd=0%dd%
[81]set yy=%yyyy:~2,2%
[82]:: calculate day-of-week, day-of-year
[83]:: get (y mod 4) * 12 + m
[84]set daysoff=0,31,59,90,120,151,181,212,243,273,304,334
[85]set /a dow=1%mm% - 100
[86]for /f "tokens=%dow% delims=," %%a in ("%daysoff%") do set /a doy=%%a +
1%dd% - 100
[87]set /a dow=%yyyy% %% 4
[88]set /a dow=%dow% * 12 + 1%mm% - 100
[89]set
daysoff=0,31,60,91,121,152,182,213,244,274,305,335,366,397,425,456,486,517,547,578,609,639,670,700
[90]if %dow% GTR 24 set
daysoff=731,762,790,821,851,882,912,943,974,1004,1035,1065,1096,1127,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430
[91]if %dow% GTR 24 set /a dow=%dow% - 24
[92]for /f "tokens=%dow% delims=," %%a in ("%daysoff%") do set zt$=%%a
[93]set /a daysoff=%yyyy% / 4
[94]set /a daysoff=%daysoff% * 1461
[95]set /a dow=1%dd% - 96 + %daysoff% + %zt$%
[96]set /a dow=%dow% %%7 + 1
[97]for /f "tokens=%dow% delims=," %%a in
("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday") do set
dayname=%%a
[98]set day=%dayname:~0,3%
[99]set /a zt$=%yyyy% %% 4
[100]if %zt$%==0 if 1%mm% GTR 102 set /a doy=%doy% + 1
[101]set /a julian=1%yy% - 100
[102]set /a julian=%julian% * 1000 + %doy%
[103]set /a julian_text=100000 + %julian%
[104]set julian_text=%julian_text:~1%
[105]set ibm_julian=%yyyy%%julian_text:~2%
[106]:: since 01/01/1901
[107]set /a zt$=%yyyy% - 1901
[108]set /a daysoff=%zt$% / 4
[109]set /a since=365 * %zt$% + %daysoff% + %doy% - 1
[110]for %%i in (zt$ daysoff) do set %%i=
[111]set yyyymmdd=%yyyy%%mm%%dd%
[112]::ECHO %YYYY%%MM%%DD%
[113]GOTO :eof
[114]
[115]:: from the four date components passed, determine the date
[116]:getdate
[117]set dd=%2&set mm=%3&set yy=%4
[118]:: if XP, dayname may be missing
[119]if not defined yy set dd=%1&set mm=%2&set yy=%3
[120]:: if yy-mm-dd format, switch dd & yy
[121]echo.|date|find "(y">nul
[122]if not errorlevel 1 set %yyyy%=%dd%&set%dd%=%yy%&set%yy%=%yyyy%
[123]:: if mm-dd-yy format, switch dd & mm
[124]echo.|date|find "(m">nul
[125]if not errorlevel 1 set %yyyy%=%dd%&set%dd%=%mm%&set%mm%=%yyyy%
[126]:: Now process month names for XP
[127]for %%Z in (01Jan 02Feb 03Mar 04Apr 05May 06Jun 07Jul 08Aug 09Sep 10Oct
11Nov 12Dec) do call :procmth %%Z
[128]:: Ensure dd and mm have leading 0s if required
[129]set yyyy=%dd:~1%
[130]if not defined yyyy set dd=0%dd%
[131]set yyyy=%mm:~1%
[132]if not defined yyyy set mm=0%mm%
[133]set yyyy=%yy:~1%
[134]if not defined yyyy set yy=0%yy%
[135]:: Ensure yy is 2-digit and yyyy 4-digit
[136]set yyyy=%yy:~2%
[137]if defined yyyy set yyyy=%yy%&goto setyy
[138]:: yy is 2-digit
[139]set yyyy=20%yy%
[140]if %yyyy% GEQ 2080 set yyyy=19%yy%
[141]:setyy
[142]set yy=%yyyy:~2%
[143]goto :eof
[144]
[145]:procmth
[146]set yyyymmdd=%mm:~0,3%
[147]set yyyy=%1
[148]set yyyy=%yyyy:~2%
[149]if /i %yyyy% NEQ %yyyymmdd% goto :eof
[150]set mm=%1
[151]set mm=%mm:~0,2%
[152]goto :eof
[153]
[154]::days.bat ends
------ batch ends --------
Lines start [number] - any lines not starting [number] have been wrapped and
should be rejoined. The [number] that starts the line should be removed
The label :eof is defined in NT+ to be end-of-file but MUST be expressed as
:eof