I wrote this routine in pure batch to get all the date elements for either today's date or any date passed to the routine.
It has an option to prompt a user for a date and does date validation checking as well as accepting or giving julian dates.
It accepts all english and 7 digit julian date formats and whatever the current English format is in use:
Set_Date today
will populate the variables below and more:
today_mdy 05-12-2013
today_ymd 20130512
today_jul 2456885
today_dte Whatever the active regional format, ie. Sun 05/12/2013 or 12-May-13
today_yy 13
today_mm 05
today_yyyy 2013
today_dow Sunday
today_mon May
etc. see the help section at the top:
Code: Select all
@echo off&goto :start
:Set_Date DateEnv [Date] or [/g="Prompt for Date: "] [/r]
echo.
echo.Usage: Set_Date.cmd DateEnv [Date] or [/g="Prompt for Date: "]
echo.Populates date variables labeled: 'DateEnv_???', see below
echo.Accepted date formats:
echo. m-d-y, m/d/y, yyyymmdd, dd-Mon-yy or 7 digit julian date
echo. If %%date%% is passed as the 2nd arg it will be interpreted
echo. according to the current regional date setting ie. yyyy.mm.dd
echo. If /r is passed then the date contained in the DateEnv variable
echo. and/or the [Date] argument will be interpreted in regional format
echo. The /r option should only be used if date input is not included
echo. in one of the default listed formats or unexpected consequences...
echo.
echo.Valid dates must be in the year 1601 or greater for the validity check
echo.Returns 0 in errorlevel if the date is valid, else non-zero
echo.
echo.If DateEnv is valid or if [Date] is passed DateEnv_??? will be set to:
echo.DateEnv_mdy will be set to mm-dd-yyyy
echo.DateEnv_ymd will be set to yyyymmdd
echo.DateEnv_y.m.d will be set to yyyy.mm.dd
echo.DateEnv_dte will be set to the current active regional date format
echo.DateEnv_jul will be set to the 7 digit Julian date
echo.DateEnv_dow will be set to day of week, ie. Monday, Tuesday, etc.
echo.DateEnv_vrb will be set to Verbose Date, ie. Saturday, August 20th, 2011
echo.DateEnv_dd will be set to the 2 digit day
echo.DateEnv_mm will be set to the 2 digit month
echo.DateEnv_yyyy will be set to the 4 digit year
echo.DateEnv_month will be set to the month, ie. February or December
echo.DateEnv_mon will be set to the 3 letter month, ie. Jan or Aug
echo.
echo.DateEnv itself will not be changed regardless if valid date or not
echo.Also formats yyyymmdd or 7 digit julian date input to desired output
echo.Example: Set_Date today %%date%% or Set_Date newyear99 01-Jan-99
echo.Finally:
echo.If DateEnv is not defined and there is no second argument then %%date%% in
echo.the current regional format will be used to populate the variables
echo.If /g is passed as 2nd argument then quoted 3rd argument will prompt for date
echo.Examples:
echo. set "AprilsFools=4/1/1"
echo. set_date AprilFools
echo. echo Aprils fools date for 2001 in Julian format is: %%AprilFools_jul%%
echo. echo Aprils fools date in 2001 was on a %AprilFools_dow% ^(Sunday^)
echo. Set_Date birthday /g="Enter your birth date: "
echo. ECHO You were born on a %%birthday_dow%%
echo. set "today="
echo. Set_Date today
echo. echo today is %today_dte% or %today_jul% in Julian format
exit /b 1
:start
set "jul="&set "Format="&set "Sep="&set "reg="
if "%~1"=="" exit /b 255
if /i "%~1" equ "/?" goto :Set_Date Syntax
SetLocal EnableDelayedExpansion
echo %*|find /i "/r">nul
if %errorlevel% equ 0 set/a reg=1&if /i "%~1" equ "/r" shift
if defined %~1 (call set jul=%%%~1%%) else (
if "%~2"=="" set "jul=%date%"
)
if not "%~2"=="" (
if /i "%~2" neq "/r" (
set "jul=%~2"&set "args=%~3"
)
) else (if not defined %~1 set/a reg=1)
call :RegDateFmt Format Separator yy mm dd jul
if /i "%~2" equ "%date%" set/a reg=1
if defined reg (
set "jul=!mm!-!dd!-!yy!"
)
if /i "%jul%" equ "/g" (
set/p jul="%args%"
) else if /i "%jul:~0,1%" gtr "9" (
if defined args set "jul=%jul% %args%"
set "jul=!jul:* =!"
) else if /i "%jul:~3,1%" gtr "9" (
set "Mon=%jul:~3,3%"
call :month_convert Mon
if !errorlevel! gtr 0 goto :BadDate
set "jul=!Mon!-%jul:~0,2%-%jul:~-2%"
)
set mdy=%jul:/=%
set mdy=%mdy:-=%
if /i %mdy% equ %jul% (
call :strlen %mdy%
if /i !errorlevel! equ 7 (
call :date_cvt mdy /j
) else (call :date_cvt jul /j)
) else (call :date_cvt jul /j)
if /i %errorlevel% equ 0 (
set/a mdy=%jul%
set/a dow=%jul% %% 7&call :set_day dow
) else (goto :BadDate)
call :date_cvt mdy /j
set "vrb=%mdy%"
call :format_verbose vrb dow month
set/a ymd=%errorlevel%
set "mon=%month:~0,3%"
set/a dte=%ymd%
call :setRegDate dte Format Separator dow mon
if /i %errorlevel% gtr 0 goto :BadDate
Endlocal&(
call set "%~1_mdy=%mdy%"&call set "%~1_ymd=%ymd%"&call set "%~1_jul=%jul%"
call set "%~1_vrb=%vrb%"&call set "%~1_dow=%dow%"&call set "%~1_dd=%ymd:~-2%"
call set "%~1_mm=%mdy:~0,2%"&call set "%~1_yyyy=%ymd:~0,4%"
call set "%~1_mon=%mon%"&call set "%~1_yy=%ymd:~2,2%"&call set "%~1_dte=%dte%"
call set "%~1_y.m.d=%ymd:~0,4%.%mdy:~0,2%.%ymd:~-2%"&call set "%~1_month=%month%"
exit /b 0
)
:BadDate
Endlocal&(
call set %~1_mdy=&call set %~1_ymd=&call set %~1_dte=&call set "%~1_jul="
call set %~1_vrb=&call set %~1_dow=&call set %~1_vrb=&call set "%~1_y.m.d="
call set "%~1_month="
)&exit /b %errorlevel%
::**********************************::
::*******|| SUBROUTINES ||*******::
::**********************************::
:set_day
SetLocal&call set/a tkn=%%%~1%%+1
for /f "tokens=%tkn%" %%a in ("Monday Tuesday Wednesday Thursday Friday Saturday Sunday") do (
set "dayofwk=%%a"
)
EndLocal&call set %~1=%dayofwk%&exit /b 1
:Date_Cvt DateEnv [/Julian] Date_env is converted [only yyyymmdd, or mm-dd-yyyy or julian needed here]
if "%~1"=="" exit /b 1
SetLocal&call set "mdy=%%%~1%%"
set ech=&set "arg="
if not "%~2"=="" (set arg=%~2&set arg=!arg:~0,2!)
xcopy /d:%mdy% /h /l "%~f0" "%~f0\">nul 2>&1
if /i %errorlevel% equ 0 (
for /f "tokens=1-3 delims=/- " %%a in ("%mdy%") do (
set m=%%a&set d=%%b&set "y=%%c"
if /i 1!m! lss 20 set "m=0!m!"
if /i 1!d! lss 20 set "d=0!d!"
if /i 1!y! lss 20 set "y=0!y!"
if /i !y! lss 80 (set y=20!y!) else (if !y! lss 100 set y=19!y!)
set "mdy=!m!-!d!-!y!"
)
) else (
set /a rc=1
for /f "tokens=1-3 delims=0123456789" %%a in ("%mdy%") do set "rc=%%a"
if /i !rc! neq 1 set /a err=2&goto :end
call :strlen %mdy%
if /i !errorlevel! gtr 8 set /a err=3&goto :end
)
set "mdy=%mdy:/=-%"
set "ymd=%mdy:-=%"
if %ymd%==%mdy% (
call :strlen %ymd%
set /a err=!errorlevel!
if /i !err! equ 7 if /i "%arg%" equ "/j" (
call :gdate %ymd%
set /a ymd=!errorlevel!
set /a err=8&set "arg="
)
if /i !err! neq 8 goto :end
set mdy=!ymd:~4,2!-!ymd:~6,2!-!ymd:~0,4!&set "ech=!mdy!"
) else (
set ymd=%ymd:~4,4%%ymd:~0,4%&set "ech=!ymd!"
)
xcopy /d:%mdy% /h /l "%~f0" "%~f0\">nul 2>&1
set /a err=%errorlevel%
if /i %err% neq 0 (set ech=)
if /i %err% equ 0 if /i "%arg%" equ "/j" (
call :jdate %ymd%
set /a ech=!errorlevel!
)
:end
EndLocal&call set "%~1=%ech%"&exit /b %err%
:Strlen Returns length of string in errorlevel [Simple version for short strings]
setlocal&set "#=%*"
if not defined # exit /b 0
set/a len=0
:loop
set/a len+=1
set "#=!#:~1!"&if not defined # endlocal&exit/b %len%
goto :loop
:jdate
SetLocal
set "yyyymmdd=%~1"
set "yyyy=%yyyymmdd:~0,4%"
set "mm=%yyyymmdd:~4,2%"
set "dd=%yyyymmdd:~6,2%"
if %mm:~0,1% equ 0 set "mm=%mm:~1%"
if %dd:~0,1% equ 0 set "dd=%dd:~1%"
set /a Month1=(%mm%-14)/12
set /a Year1=%yyyy%+4800
set /a JDate=1461*(%Year1%+%Month1%)/4+367*(%mm%-2-12*%Month1%)^
/12-(3*((%Year1%+%Month1%+100)/100))/4+%dd%-32075
EndLocal&exit /b %JDate%
:gdate
SetLocal
set /a p = %1 + 68569
set /a q = 4 * %p% / 146097
set /a r = %p% - ( 146097 * %q% +3 ) / 4
set /a s = 4000 * ( %r% + 1 ) / 1461001
set /a t = %r% - 1461 * %s% / 4 + 31
set /a u = 80 * %t% / 2447
set /a v = %u% / 11
set /a GYear = 100 * ( %q% - 49 ) + %s% + %v%
set /a GMonth = %u% + 2 - 12 * %v%
set /a GDay = %t% - 2447 * %u% / 80
if /i 1%GMonth% lss 20 set "GMonth=0%GMonth%"
if /i 1%GDay% lss 20 set "GDay=0%GDay%"
set "GDate=%GYear%%GMonth%%GDay%"
EndLocal&exit /b %GDate%
:Format_Verbose M/D/Y dayofweek to verbose date
SetLocal&call set "dte=%%%~1%%"
set "dow=%%%~2%%"
set "st="
set "day=%dte:~3,2%"
set "mon=%dte:~0,2%"
set "year=%dte:~6,4%"
set "ymd=%year%%mon%%day%"
set "dy=%day:~1%"
if %day:~0,1% equ 0 set "day=%day:~1%"
if %mon:~0,1% equ 0 set "mon=%mon:~1%"
set months=January February March April May June^
July August September October November December
for /f "tokens=%mon%" %%a in ("%months%") do set "month=%%a"
if /i %dy% equ 0 set "st=th"
if /i %dy% gtr 3 set "st=th"
if /i %day% geq 11 if /i %day% leq 13 set "st=th"
if defined st goto :end
set/a rst=%day% %% 10
for /f "tokens=%rst%" %%s in ("st nd rd") do set "st=%%s"
:end
set "dow=%dow%, %month% %day%%st%, %year%"
EndLocal&call set %~1=%dow%&call set %~3=%month%&exit /b %ymd%
:RegDateFmt Format Separator y m d dte
if "%~2"=="" exit/b 1
setlocal EnabledelayedExpansion
set "Day="&set "Mon="&set "dte="
if not "%~6"=="" set "dte=!%~6!"
if not defined dte set "dte=%date%"
for /f "tokens=2 delims=:" %%A in ('date^<nul') do set Format=%%A&goto :next
:next
set "Format=%Format: =%"
for %%A in (/ - . ,) do (
echo %Format%|find "%%A">nul&if !errorlevel! equ 0 set "Separator=%%A"
)
if /i %Format:~0,1% gtr 9 set "Day=Day "
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('date^<nul') do (
set "Format=%Day%%%a%Separator%%%b%Separator%%%c"
for /f "tokens=1-3 delims=.-/ " %%d in ("%dte:* =%") do (
set %%a=%%d&set %%b=%%e&set "%%c=%%f"
echo !yy:~3!|find "ECHO">nul
if /i "!errorlevel!" neq "0" set "Format=!Format:yy=yyyy!"
if /i "!mm:~0,1!" gtr "9" (
set "Format=!Format:mm=Mon!"
call :month_convert mm
if /i "!errorlevel!" neq "0" endlocal&exit/b 1
)
)
)
endlocal&(
call set "%~1=%Format%"
call set "%~2=%Separator%"
if not "%~3"=="" call set "%~3=%yy%"
if not "%~4"=="" call set "%~4=%mm%"
if not "%~5"=="" call set "%~5=%dd%"
)&exit/b 0
:month_convert
set "months=Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
call set "month=%%%~1%%"
set/a mnum=0
for %%m in (%months%) do set/a mnum+=1&if /i %month% equ %%m call set "%~1=!mnum!"&exit /b 0
exit/b 1
:setRegDate dte format sep dow mon
setlocal EnableDelayedExpansion
if /i "%~5"=="" exit/b 1
set mon=!%~5!&set dow=!%~4!&set "dow=!dow:~0,3! "
set sep=!%~3!&set "format=!%~2!"&set "dte=!%~1!"
set yyyy=%dte:~0,4%&set yy=%dte:~2,2%&set mm=%dte:~4,2%&set "dd=%dte:~-2%"
set "toks=2-4"
echo %format%|find " ">nul
if %errorlevel% equ 1 set "dow="& set "toks=1-3"
for /f "tokens=%toks% delims=%sep% " %%a in ("%format%") do (
set "dte=%dow%!%%a!%sep%!%%b!%sep%!%%c!"
)
endlocal&call set "%~1=%dte%"&exit/b 0
Copy paste and try it out. I know it works on XP, Vista, Win7
I would appreciate feedback from anyone who tries it out.
Carl