News, Product Information, and Tips
Check out our free utlities in the downloads section

Remote Administration



Remote Administration For Windows. Easy remote access of Windows 7, XP, 2008, 2000, and Vista Computers

Click here to find out more

Create Outlook Profiles



No more setup wizards in Outlook. Setup Outlook Profiles automatically from the command line

Click here to find out more

Network Administrator



Reboot Hundreds of computers, disable flash drives, deploy power managements settings.

Click here to get your free copy of Network Administrator. Over 25 plugins to make your life easier

USB Disabler



Disable Flash Drives for specific users, or only allow specific drives.

Click here for your free trial

Search

Archives

Create a date and time stamp in your batch files

by Steve Wiseman on February 16, 2007 · 22 comments

in Windows

Here is an interesting one. I found a way to take the %date% environment variable, and turn it into a valid string for a filename – without any extra programs or scripts.

For the longest time I used a little utility I created to do this. The problem with that is the utility needs to be around if you want to send the batch file to someone.

What I didn’t know that was that you can use this character combination ‘:~’ to pull a substring out of an environment variable. That is when I realized you could use this to pull out parts of the current date (or time).

Here is how it works. Lets take the %date% variable and print it out

echo %date%

It comes back …At least today ;) .. with

Thu 02/15/2007

Not sure if the length of the day changes. It may be always the same. To be safe we can pull the year, month and day starting from the right.

The :~ substring command works like this:

:~[START POS],[LENGTH]

If [START_POS] is positive or zero the substring will start from the left. If the number [START_POS] is negative it will start from the right. And [LENGTH] is the number of characters in the opposite direction of the starting point.

I know this might be confusing at first, but you will see what I am talking about.

If we wanted to get the current year we could start 4 from the end, and 4 in length. Like this:

echo %date:~-4,4%

For the month we start 7 from the right (Length of Year + Length of Month + 1 Slash)

echo %date:~-7,2%

For the day we start 10 from the right (Length of Year + Length of Month + Length Of Day + 2 Slashes)

echo %date:~-10,2%

Bringing it all together. Lets say I zipped up a folder every night for archival purposes, and wanted a different filename for each day (Not sure if this pkzip syntax is correct, but that is not important for our discussion here)

pkzip c:\ImportantFolder\*.* c:\TempZip.zip
ren C:\TempZip.Zip c:\TempZip_%date:~-4,4%%date:~-7,2%%date:~-10,2%.zip

Which renames our C:\TempZip.Zip to C:\TempZip_20070215.zip

Perfect. I get a date stamped file, and no special vbscript, or command line program is needed.

The same method could be used for the current time

I am still amazed this little trick works.

Like this article? Then sign up for my newsletter to get free tips and software sent right to your inbox once a week. Like you, I hate spam – I will never spam, or sell your email address.

Related Articles:

{ 1 trackback }

Date and time stamp in your batch files
November 11, 2009 at 3:23 pm

{ 21 comments… read them below or add one }

1 John October 14, 2009 at 1:43 pm

Great!!
Working Fine……..

2 date *and* time October 28, 2009 at 9:11 am

here’s the “and time” bit:

I know it might sound obvious, but…
…….for time, use environment variable %time%

3 Steve Wiseman October 28, 2009 at 9:34 am

Good point. Title did not match my article. You can use the same principals with the time variable, and include hours, minutes, seconds, and milliseconds.

Here they are:

Milliseconds: %time:~-2,2%
Seconds: %time:~-5,2%
Minutes: %time:~-8,2%
Hours: %time:~-11,2%

4 Lizzy November 2, 2009 at 1:10 am

Hi,

Thanks, These are very helpful tips.

The problen is that when retrieving the hour from the current time variable,
it appears with a leading space (instead of leading zero), when the hour is less than 10.

Any idea to solve it?

Lizzy

5 Steve Wiseman November 2, 2009 at 8:23 am

Here is the way to trim it:

SET HOUR=%time:~-11,2%
Call :TRIM %HOUR%
GOTO :EOF
:TRIM
Set HOUR=%*
:EOF
REM You would use your trimmed hour right here
@echo %HOUR%

6 Jim November 12, 2009 at 3:51 pm

fyi: the below line should be changed

from this: DATESTMP=%date:~-4,4%%date:~-7,2%%date:~-10,2%%HOUR% SET

swap 10,2 and 8,2 (date to be y/m/d)
insert :TRIM (else blank between hour and rest (m/s_DATA.ZIP)

to this: DATESTMP=%date:~-4,4%%date:~-10,2%%date:~-7,2%%HOUR% :TRIM SET

Great concept. thanks.

7 Steve Wiseman November 12, 2009 at 7:22 pm

What format is your date in DD/MM/YYYY or MM/DD/YYYY…when you echo %date% at the command line?

Thanks.

8 bryan December 28, 2009 at 11:07 pm

Hi Guys,

i am newbie in the Batch file creation and hoping you guys can help and guide me on the following:-

i wanted to created a batch file to :-
1st – zip a folder containing a txt files
2nd – the batch file shall ignore the current date folder
3rd – the batch shall be executed on 1200am daily.
4th – the zipped folder name should retained
5th – once the folder has been zipped, it will be move to a dedicated folder (to another HDD or even to a network folder)

By the way, i am using power archiver 2001.

Thank you in advance..
bryan

9 Israel Torres August 19, 2010 at 10:49 am

@Lizzie – perhaps a little late but here’s how I ended up doing the leading space issue for the time :)

set tmp_time=%time:~-11,2%%time:~-8,2%%time:~-5,2%
:: method 1 use this to trim leading space entirely
::set tmp_time=%tmp_time: =%

:: method 2 use this to replace leading space with 0
set tmp_time=%tmp_time: =0%

@ Steve W. – Thanks!

Israel Torres

10 Bewc September 22, 2010 at 9:20 pm

Steve,

Thanks you for the article! Here’s my take… I like double digit hours, so the trim doesn’t work for me. I think it makes it harder visually and in script to parse.

Here are how I break down my variables (not all of them are used in a given script):

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hourMilitary=%time:~-11,2%

::::: identify hours in Civilian time, and identify AM or PM
for /f “tokens=1-2*” %%t in (‘time /t’) do (
set twelvehourtime=%%t
set AMPM=%%u
)

set hourCivilian=%twelvehourtime:~0,2%

::::: I like my hours double digit
if “%AMPM%” == “AM” set hourMilitary=%hourCivilian%

set minute=%time:~-8,2%
set second=%time:~-5,2%
set millisecond=%time:~-2,2%

::::: identify Name of the day and provide short date for today
for /f “tokens=1-2*” %%v in (‘date /t’) do (
set dayName=%%v
set todaysdate=%%w
)

set datetimestamp=%year%%month%%day%%hour%%minute%%second%

::::: demonstrate math abilities of “set /a” by getting yesterday’s number
set /a TODAYminus1=%day%-1

::::: then do something practical, like query for the last 24 hours of event logs
set yesterdaysstamp=%month%/%TODAYminus1%/%year%,%hourCivilian%:%minute%:%second%%AMPM%

echo year is %year%
echo month is %month%
echo day is %day%
echo hourMilitary is %hourMilitary%
echo hourCivilian is %hourCivilian%
echo AMPM is %AMPM%
echo minute is %minute%
echo second is %second%
echo millisecond is %millisecond%
echo dayName is %dayName%
echo todaysdate is %todaysdate%
echo datetimestamp is %datetimestamp%
echo TODAYminus1 is %TODAYminus1%
echo.
echo %yesterdaysstamp%
echo.

eventquery /l application /v /fo list /fi “Datetime gt %yesterdaysstamp%” >> d:\%datetimestamp%_last24hourslogs.txt

I’m hoping someone finds this useful, so I know I gave back.

Thanks again!

-Bewc

11 MGnP September 23, 2010 at 11:47 am

Bewc,

Excellent. Thank you very much, this is exactly what I was looking for.
MGnP

12 Tom Summers October 5, 2010 at 2:49 pm

Thanks Steve, we’ve been fighting the time thing all morning. This helps alot. Again thanks

13 Roger February 14, 2011 at 8:25 pm

It seems to me that I have seen quite a similar example in the setup package of Dr.Batcher ( http://www.drbatcher.com ). This is an utility to create batch files, and it’s extremely useful.

14 brijesh May 16, 2011 at 11:47 am

Hey guys,

could someone help me in displaying current timestamp.

i tried
%date:~-4,4%/%date:~-7,2%/%date:~-10,2% %time:~-11,2%:%time:~-8,2%:%time:~-5,2%

but its quite long and putting it in a variable then displaying the variable show the time when i set that variable.

please let me know how should i use that variable to show the current date and time

thanks

15 Aidan July 8, 2011 at 6:48 am

I hate windows so thanks to all above for doing the hard work me! Very usefu, thanks again.

Aidan

16 Steve Wiseman July 8, 2011 at 9:38 am

Glad to help Aidan. Thanks for taking the time to comment – Steve

17 Bill July 27, 2011 at 2:09 am

Hi All!!!
Thanks for ALL the GREAT ideas!
I wanted to know how I can get the timestamp of a FILE to echo in a batch, rather than just the system time.
I am FTPing a file once a minute from a camera server, and sometimes the server hangs and doesn’t update the image, so the time stamp doesn’t change.
I wanted to be able to see the image’s timestamp displayed while my batch is running.
Any ideas? (I am using a simple command (DOS) window and a batch file that displays all FTP activity, EXCEPT the file’s timestamp).
Thannks!!!

18 anon August 22, 2011 at 5:53 pm

Create a filename with Date and Time stamp, cleanly.

SET CurrentDate=%date:~-4,4%%date:~-7,2%%date:~-10,2%
SET CurrentTIme=%time:~-11,2%%time:~-8,2%%time:~-5,2%

echo c:\%CurrentDate%_T%CurrentTime%.csv

19 Smari September 20, 2011 at 9:17 am

Thanks a lot Steve. that was very helpful.

20 Joel November 18, 2011 at 6:26 pm

This was a great, simple solution. And thanks to other posters, who added the code to get the Hours, Minutes, Seconds.

21 Derek Morin December 23, 2011 at 10:21 am

Awesome code Bewc!! That is really fantastic and you obviously put a lot of effort into it.

In case others hit an error:

I hit error with using this code, but it turned out the that double quote and single quote characters didn’t paste well from the website, and I just needed to change them on the two “for” loop lines.

I also added @echo off at the top of the batch file to just see the output.

Leave a Comment

Category Links - Windows Forum - Exchange Forum