Date manipulation

Started by Dusty, December 07, 2008, 11:50:33 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dusty

Manipulating dates in the Windows XP Command window.
The ability to manipulate dates in batch scripting is very limited.  Day, Month and Year can be extracted from either the 'date /t' command or the %date% environment variable only if the date format is known.  Returning dates in advance of, or prior to, today's date requires many lines of coding to check for such things as a new month, new year, leap year etc.

The following two codings will extract day date month and year from the date format day mm/dd/yyyy.


@echo off
cls

FOR /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
set day=%%a
set mm=%%b
set dd=%%c
set yy=%%d
)

echo %day% %dd% %mm% %yy%


@echo off
cls

set day=%date:~0,3%
set mm=%date:~4,2%
set dd=%date:~7,2%
set yy=%date:~-4%

echo %day% %dd% %mm% %yy%




Returning dates in advance of, or prior to, today's date.
If one wanted to use a date which was 3, 30 or even 300 days ago or hence it is best achieved using a scripting language other than batch script.

Visual Basic Scripting language (VBS) is a built-in feature of Windows XP so for those who do not like to install programs/routines on their pc the following code gives the opportunity to manipulate dates to suit individual requirements.  (Only one small temporary file is created in the %Temp% folder and is deleted when no longer required).  VBS is used in conjunction with batch scripting to extract/display the various components of the date.  The code will be successful with any date format.


:: Acknowledgement.  Dias de verano for his input to set up the .vbs file.

:: Syntax: filename only - set/display today's date.
::         filename -n   - set/display today's date minus n days.
::         filename +n   - set/display today's date plus  n days.

@echo off
cls

:: Check for incorrect commandline entry..
set a=%1

if "%a%"=="" goto start
if "%a:~0,1%"=="+" goto start
if "%a:~0,1%"=="-" goto start

echo.&echo.
echo                     Incorrect entry - run aborted
echo.
echo                     Press any key to continue....
pause > nul
cls & exit/b

:: Create/run temporary .vbs file (extracts date components).
:start
set vb=%temp%\newdate.vbs
(
echo Newdate = (Date(^)%1^)
echo Yyyy = DatePart("YYYY", Newdate^)
echo   Mm = DatePart("M"   , Newdate^)
echo   Dd = DatePart("D"   , Newdate^)
echo   Wd = DatePart("WW"  , Newdate^)
echo   Wn = DatePart("Y"   , Newdate^)
echo   Ww = datepart("W"   , Newdate^)

echo Wscript.Echo Yyyy^&" "^&Mm^&" "^&Dd^&" "^&Wd^&" "^&Ww^&" "^&Wn
)>>%vb%

FOR /F "tokens=1-6 delims= " %%A in ('cscript //nologo %vb%') do (
        set Yyyy=%%A
        set Mm=%%B
        set Dd=%%C
        set Week#=%%D
        set Weekday#=%%E
        set Day#=%%F
)

del %vb%
::                    [Environment Variables are:
::                     %Yyyy%     Year in the format yyyy
::                     %Mm%       Month in the format m or mm
::                     %Dd%       Number of the day in month in the format d or dd (range 1 thru'31)
::                     %Week#%    Week number in year in the format w or ww (range 1 thru' 52)
::                     %Weekday#% Day number in week in the format w
::                                     (range 1 thru' 7, day#1 is Sunday)
::                     %Day#%     day number in the year in the format d thru ddd
::                                     (range 1 thru' 366)]

set days=
if not "%1"=="" set days=days
if %Mm% lss 10 set Mm=0%Mm%
if %Dd% lss 10 set Dd=0%Dd%

:: The following code serves to demonstrate just two of the formats which can be displayed.

echo.&echo.&echo.&echo.&echo.&echo.
echo            Date to be displayed is today %1 %days%
echo.
echo            Example of date in yyyy/mm/dd format:   %Yyyy%/%Mm%/%Dd%
echo               "    "   "    " mmddyyyy     "   :   %Mm%%Dd%%Yyyy%
echo.&echo.&echo.
echo            Press any key to continue...
pause > nul
cls & exit /b






For those who have no objection to installing a small utility in order to manipulate dates please download DOFF.ZIP from http://www.jfitz.com/dos/index.html and unzip it into your Path - the code below will be successful with any date format.


@echo off
cls

:: Syntax: filename only - set/display today's date.
::         filename -n   - set/display today's date minus n days.
::         filename +n   - set/display today's date plus  n days.

for /f "tokens=1-3 delims=/ " %%a in ('doff mm/dd/yyyy %1') do (
    set mm=%%a
    set dd=%%b
    set yyyy=%%c
)

:: The following code serves to demonstrate just two of the formats which can be displayed.

set days=
if not "%1"=="" set days=days

echo.&echo.&echo.&echo.&echo.&echo.
echo Date to be displayed is today %1 %days%
echo.
echo Date in the format dd mm yyyy           %dd% %mm% %yyyy%
echo.&echo.
echo Date in the format yyyy/mm/dd           %yyyy%/%mm%/%dd%



To view some of the capabilities of Doff.exe after unzipping it into your Path, at the Command Prompt enter:

Doff dd                        returns the day only
Doff mm                       returns the month only
Doff yy                         returns the year only e.g. 08
Doff yyyy                      returns the year only e.g. 2008
Doff ddmmyy                returns the day month and year e.g. 231008
Doff mmddyyyy             returns the month day and year e.g. 10312008
Doff ddmmyyyy -30       returns today's date minus 30 days
Doff mmddyyyy +300    returns today's date plus 300 days

for /f %%I in ('doff yyyymmdd +10') do echo %%I

will return todays date +10 days in the format yyyymmdd

Note that throughout the above codings syntax checking is minimal or non-existent.  If the syntax of any command-line entry is incorrect the results are unpredictable.

Good luck.
One good deed is worth more than a year of good intentions.