How do I get current date/time on the Windows command line in a suitable format for usage in a file/folder name?
Asked Answered
M

30

637

Update: Now that it's 2016 I'd use PowerShell for this unless there's a really compelling backwards-compatible reason for it, particularly because of the regional settings issue with using date. See @npocmaka's https://mcmap.net/q/22637/-how-do-i-get-current-date-time-on-the-windows-command-line-in-a-suitable-format-for-usage-in-a-file-folder-name


What's a Windows command line statement(s) I can use to get the current datetime in a format that I can put into a filename?

I want to have a .bat file that zips up a directory into an archive with the current date and time as part of the name, for example, Code_2008-10-14_2257.zip. Is there any easy way I can do this, independent of the regional settings of the machine?

I don't really mind about the date format, ideally it'd be yyyy-mm-dd, but anything simple is fine.

So far I've got this, which on my machine gives me Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

I can live with this, but it seems a bit clunky. Ideally it'd be briefer and have the format mentioned earlier.

I'm using Windows Server 2003 and Windows XP Professional. I don't want to install additional utilities to achieve this (although I realise there are some that will do nice date formatting).

Mattheus answered 14/10, 2008 at 22:25 Comment(1)
use powershell people... [datetime]::now.tostring("yyyy-MM-dd")Adjuvant
L
745

See Windows Batch File (.bat) to get current date in MMDDYYYY format:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

If you prefer the time in 24 hour/military format, you can replace the second FOR line with this:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:> .\date.bat
2008-10-14_0642

If you want the date independently of the region day/month order, you can use "WMIC os GET LocalDateTime" as a source, since it's in ISO order:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:>test.cmd
Local date is [2012-06-19 10:23:47.048]

Lawler answered 14/10, 2008 at 22:36 Comment(22)
This is good! On my system 'time /t' gives '11:58 PM'. I could add another line with "set mytime=%mytime: =_%", or any other tweaks you can suggest?Mattheus
Added in another potential option to display in 24hr time, obviating the need for a PM/AM designatorLawler
For UK folks you'll want For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) for the second line.Mattheus
This solution is locale dependent, Rory gave the example for UK for other locales where the date comes as 22-02-2012 you need to replace delims=/ with delims=-Herbertherbicide
On my system %TIME% returns values like " 0:01:15" and " 3:15:12" and the %%a%%b code in the answer gives a leading space like " 001" and " 315". To get a four digit hhmm use this: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b)) That returns values like "0001" and "0315" which I prefer in my filenames.Euryale
Nice version of the wmic command! So far I've only seen WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Likewise, to get 20120623-1619 in my local Amsterdam time zone, in one line: for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%Cloth
The ISO order is appreciated (huzzah for automatic sorting), but note that full colons are not valid characters in Windows filenames (as per the OP)!Divinity
there is a problem with the military time example above, using %TIME% If the hour is before 10am you end up with " 9" which when you string it together yields a space in your variable string. Not good if you're using it for a filename. :-(Lester
if you include a space after the delim list for time... for /f "tokens=1-2 delims=/: " %%a in ('time /t') do (set mytime=%%a%%b) it will treat the AM/PM as a separate delimeter and not pick it upLester
Make sure to call set mydate= (unsets mydate) before the forloop. Otherwise, it won't get reset when you call the same batch file within the same console instance.Borlow
For me it says %%a was unexpected at this time.Maybellmaybelle
Is it possible to load files with created date using xp_cmdshell in SQL Server ? I have tried "forfiles" command but to no avail. I have asked a question on stackoverflow, please kindly see the link @ https://mcmap.net/q/22640/-how-to-load-files-according-to-created-date-in-windows-command-shell-via-sql-server-39-s-xp_cmdshell/3327081Astilbe
What is the point of '. and .' around %%i and LocalDateTime? It seems to match on every line of wmic and results in ldt set to nothing.Prevail
This works well except it misses the 'day' part from my side. The output file is "pmtctdb_backup.-03-2017_1629.sql". Any reason why?Ballflower
@Scottzuz22Blacklock that's only if you run it from the command line. the %%a escapes the first percent sign which is necessary for a batch file. For the command line, just remove the second percent sign. Per: stackoverflow.com/a/2340018Producer
This For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) not working in Windows 10.Nava
@Ballflower it's almost certainly your regional date format, the original is for US. See the comment above regarding the UK and try to adapt it for the string you get when you run date /t at the command line.Briney
How can something simple like getting the actual time be so complicated? :SMunguia
For Germany the date is decoded with For /f "tokens=1-3 delims=. " %%a in ('date /t') do (set CURR_DATE=%%c%%b%%a)Dipsomaniac
Can we get the day of the week also with this?Altercation
If you replace %% with % this works on Windows 11 on the command line, but not in batch files. The %% syntax works in a batch file but not on the command line.Cottingham
How would we also get the seconds in the time? I have tried adding %%c but it does not work.Hayne
Y
139

Two more ways that do not depend on the time settings (both taken from :How get data/time independent from localization:). And both also get the day of the week and none of them requires admin permissions!:

  1. MAKECAB - will work on EVERY Windows system (fast, but creates a small temp file) (the foxidrive script):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    More information about get-date function.

  2. ROBOCOPY - it's not native command for Windows XP and Windows Server 2003, but it can be downloaded from microsoft site. But is built-in in everything from Windows Vista and above:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    And three more ways that uses other Windows script languages. They will give you more flexibility e.g. you can get week of the year, time in milliseconds and so on.

  3. JScript/batch hybrid (need to be saved as .bat). JScript is available on every system form NT and above, as a part of Windows Script Host (though can be disabled through the registry it's a rare case):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT/BATCH hybrid (Is it possible to embed and execute VBScript within a batch file without using a temporary file?) same case as JScript, but hybridization is not so perfect:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. PowerShell - can be installed on every machine that has .NET - download from Microsoft (v1, v2, v3 (only for Windows 7 and above)). It is installed by default on everything from Windows 7/Windows Server 2008 and above:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    To use it from a batch file:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Self-compiled jscript.net/batch (never seen a Windows machine without .NET, so I think this is a pretty portable):

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logman This cannot get the year and day of the week. It's comparatively slow and also creates a temporary file and is based on the time stamps that logman puts on its log files. It will work on everything from Windows XP and above. It probably will be never used by anybody - including me - but is one more way...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. One more way with WMIC which also gives week of the year and the day of the week, but not the milliseconds (for milliseconds check foxidrive's answer):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. Using TYPEPERF with some efforts to be fast and compatible with different language settings and as fast as possible:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA allows calling JavaScript methods similar to the JScript method demonstrated in #3 above. Bear in mind that JavaScript's Date object properties involving month values are numbered from 0 to 11, not 1 to 12. So a value of 9 means October.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    
Yang answered 5/11, 2013 at 21:21 Comment(9)
for powershell C:\>for /f %%i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"') do set datetime=%%i C:\>echo %datetime%Strychnic
makecab: this works by creating a file called ~.rpt, and searching a string inside it, beginning with makecab, which is a line like MakeCAB Report: Tue Sep 02 22:15:57 2014. for me this command is not localized it's locale independent. This trick is relying on that. Let's hope it won't ever be, or else beware!Whitney
Hi, I was able to load files according to Modified date using a command below, ‘z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”‘ But I wanna know how to load files according to Created date. Any help would be very appreciated. A question’s been asked on stackoverflow but no answer yet. Please take a look at the link for the details @ https://mcmap.net/q/22640/-how-to-load-files-according-to-created-date-in-windows-command-shell-via-sql-server-39-s-xp_cmdshell/3327081Astilbe
I enjoy the opening text "Two more..." followed by 8 solutions.Anguine
What, no mshta hybrid? :) Mind if I edit your answer and add one? This seems to be the best collection of esoteric solutions, and it seems like mshta belongs here.Fichtean
@Fichtean - not at all - go ahead :)Yang
The accepted solution wouldn't work for me no matter what I tried. Multiple of these solutions worked for me. (Batch and Powershell).Hockey
#2 Robocopy no longer works, the output format was localised in a recent Windows update.Neume
A bit late to the party, but a locale independent version using Robocopy can be obtained from here: SS64Hubing
S
121

Regionally independent date time parsing

The output format of %DATE% and of the dir command is regionally dependent and thus neither robust nor smart. date.exe (part of UnxUtils) delivers any date and time information in any thinkable format. You may also extract the date/time information from any file with date.exe.

Examples: (in a cmd-script use %% instead of %)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Any text

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Text: 09/12/22-any text-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03"`

The date/time information from a reference file:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Using it in a CMD script to get year, month, day, time information:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Using it in a CMD script to get a timestamp in any required format:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Extracting the date/time information from any reference file.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Adding to a file its date/time information:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe is part of the free GNU tools which need no installation.

NOTE: Copying date.exe into any directory which is in the search path may cause other scripts to fail that use the Windows built-in date command.

Sedulous answered 23/12, 2009 at 9:40 Comment(7)
Much better than the oddly more popular solution above but I had to add /t to avoid the prompt on Windows 8.1Regal
Built-in Windows 8.1 date.exe seems to be locale dependent. It returns the date in dd/MM/yyyy on my system, if it were locale-independent I would expect either MM/dd/yyyy or yyyy-MM-dd. I don't think this answer is talking about the built-in date.exe but some third-party version of it.Monitorial
it is locale independant if you provide it with the desired format on the command linePipestone
Please notice that date.exe (part of UnxUtils) is not the same as the build-in date command. So if you have to add /t the windows date command is executed. If something like date.exe +"%Y-%m-%d" works, you have installed the UnxUtils correctly. :-)Circumfuse
I just used date.exe but renamed it to date_unxutils.exe and utilized it within batch script using temporary (session-lived) PATH assignment.Histolysis
In case if anyone is interested... https://mcmap.net/q/22637/-how-do-i-get-current-date-time-on-the-windows-command-line-in-a-suitable-format-for-usage-in-a-file-folder-nameHistolysis
any way to get milliseconds with this method?Altercation
W
45

Here's a variant from alt.msdos.batch.nt that works local-independently.

Put this in a text file, e.g. getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

To get the code to work sans error msg's to stderr, I had to add the single quotes arount the variable assignments for %%a, %%b and %%c. My locale (PT) was causing errors at one stage in the looping/parsing where stuff like "set =20" was getting executed. The quotes yield a token (albeit empty) for the left-hand side of the assignment statement.

The downside is the messy locale variable names: 'yy', 'mm' and 'dd'. But hey, who cares!

Wreckfish answered 8/7, 2010 at 10:50 Comment(3)
This is perfect and is the simplest and most elegant approach i've seen to date.Quadriga
See also Jeroen's enhancements, needed as not all locales use the strings dd, mm and yy in the output of echo:^|date.Cloth
doesn't work on all locales. (In German date gives Geben Sie das neue Datum ein: (TT-MM-JJ), where the JJ breaks your script (expects YY))Trollope
J
43

I use this (again not region independent (UK))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
Jozef answered 12/4, 2009 at 13:13 Comment(7)
See Cmd.exe Environment Variables with Colon and Tilde on this little known but very efficient technique. (A pointer to a Microsoft authoritative reference would be appreciated.)Jacinthe
Here's Microsoft's Batch File Reference for Windows XP. That reference includes Using batch parameters. Unfortunately, no discussion of the 'slicing' technique.Jacinthe
This doesn't quite work for me. Maybe it is something to do with regional settings? I get an output of "/15/- 1-We_1009" when running it on Wednesday, October 15, 2014.Esquivel
The is very precise and accurate. I think this is the best answer for the question because you don't need any adjustments to use it as a file name. Thanks for sharing!Dioptric
set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%.%time:~6,2%Aperture
@Jacinthe Microsoft's built-in help for the SET command explains how to obtain a substring when expanding an environment variable. This is reproduced verbatim here: <robvanderwoude.com/allhelpw10pro_en.php#SET> See the section "May also specify substrings for an expansion."Flying
%date% and %time% are is locale dependent and aren't a suitable format for usage in a file/folder nameCataclinal
R
38

The first four lines of this code will give you reliable YY DD MM YYYY HH Min Sec variables in Windows XP Professional and higher.

@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
Roulette answered 7/9, 2014 at 19:47 Comment(3)
Perfect, this is the best solution for me as calling PS will result in the appearance of the cmd text to go funny looking.Griffon
anyway to get milliseconds?Altercation
@JonGrah use powershell instead: Get-Date -Format "hh:mm:ss.fff" (add more fs as you want), Get-Date -Format FileDateTime, Get-Date -Format FileDateTimeUniversalCataclinal
H
26

Unfortunately this is not immune to regional settings, but it does what you want.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Amazing the stuff you can find on Wikipedia.

Hostetler answered 14/10, 2008 at 22:43 Comment(2)
Mark - Found Cmd.exe Environment Variables with Colon and Tilde which describes the variable 'slicing' technique exhibited in your answer. Not finding that info any longer in the Wikipedia article. Would like to find an authoritative reference from Microsoft.Jacinthe
Here's Microsoft's Batch File Reference for Windows XP. That reference includes Using batch parameters. Unfortunately, no discussion of the 'slicing' technique.Jacinthe
A
22

Please use the following script to get the current day in the command line:

echo %Date:~0,3%day
Altdorfer answered 15/7, 2011 at 13:0 Comment(3)
Played a bit around with this, it is the shortest I found to get Date and Time: echo %date% %time%Conscionable
This is IMHO the easiest solution if you want to use the date and time just for logging purposes...Tantalous
%date% is locale dependent and isn't a suitable format for usage in a file/folder nameCataclinal
F
16
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
Fort answered 4/12, 2009 at 19:44 Comment(2)
http://www.dotnetperls.com/7-zip-examples has some good points may be useful for some one in future.Inez
%date% is locale dependent and isn't a suitable format for usage in a file/folder nameCataclinal
F
14

Another way (credit):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Note that both my answers here are still reliant on the order of the day and month as determined by regional settings - not sure how to work around that.

Felike answered 14/10, 2008 at 22:36 Comment(1)
date returns locale-dependent result. Don't use it because this will return wrong results in most non-US PCsCataclinal
F
13

This isn't really briefer but might be a more flexible way (credit):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
Felike answered 14/10, 2008 at 22:31 Comment(0)
N
11

Short answer :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Long answer

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE
Normanormal answered 18/5, 2010 at 6:3 Comment(4)
:: in cmd for /f %i in ('PowerShell -Command "get-date" -format "yyyyMMdd"') do set yyyyMMdd=%i ::in cmd script for /f %%i in ('PowerShell -Command "get-date" -format "yyyyMMdd"') do set yyyyMMdd=%%iNormanormal
there are better ways to get locale-independent date. Most people won't read the comments and use this wronglyCataclinal
you minus the answer and stated that there is a better way of doing this without actuall showing it - talk is cheap , show me the code ...Normanormal
who need to show? there are lots of answers on top having far better solutions and I've used them for decades. The simplest one is just wmic os get LocalDateTime /VALUECataclinal
K
10

Here's a way to get date time in a single line:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

In the US this will output "yyyy-mm-dd hhmm". Different regional settings will result in different %date% outputs, but you can modify the token order.

If you want a different format, modify the echo statement by rearranging the tokens or using different (or no) separators.

Keaton answered 4/10, 2010 at 20:57 Comment(2)
Is there a way to get the time in a 12 hour format and also to display AM or PM information?Oaken
never use %date% %time%. @Oaken use powershell Get-Date -Format instead. In cmd you'll need to use an external tool or parse the result to get AM/PM. But this question is about date time in filenames and there shouldn't be AM/PM at allCataclinal
A
9

Just use this line:

PowerShell -Command "get-date"

Update: The comment by @phuclv is indeed a better solution as it avoids potentially problematic characters like the colon:

PowerShell -Command "get-date" -format "yyyyMMdd_HHmmss"
Armalla answered 19/11, 2014 at 8:51 Comment(1)
no this is still wrong, it returns the date in local format which isn't a suitable format for usage in a file/folder name at all. How on earth are Tuesday, 12 March 2024 09:00:51 good in filenames? It's also not independent of the regional settings of the machine as required. The format suitable is get-date -format "yyyyMMdd_HHmmss"Cataclinal
F
8

Matthew Johnson's one-liner solution to get the one-liner date and time is eloquent and useful.

It does however need a simple modification to work from within a batch file:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
Forgiveness answered 28/4, 2013 at 16:5 Comment(4)
Does not work in CMD (%%a was unexpected at this time) or in PowerShell (Missing opening '(' after keyword for) on Windows 8.1Regal
Rainabba, that is exactly the error you get when that command is issued from the CMD line. However, "from within a batch file", the command returns "2014-01-30 1324".Forgiveness
or much simpler would be without the for loop echo %date:/=-%%time::=-%Calcific
this is wrong, %date% and %time% are locale dependent and should be avoided. Use a locale-independent method insteadCataclinal
M
7

I changed the answer with the batch file from vMax so it works with the Dutch language too.
The Dutch - persistent as we are - have a few changes in the %date%, date/t, and date that break the original batch-file.

It would be nice if some people can check this against other Windows locales as well, and report back the results.
If the batch-file fails at your location, then please include the output of these two statements on the command prompt:
echo:^|date
date/t

This is a sample of the output you should get from the batch-file:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Here is the revised code with comments on why:

:: https://mcmap.net/q/22637/-how-do-i-get-current-date-time-on-the-windows-command-line-in-a-suitable-format-for-usage-in-a-file-folder-name
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

--jeroen

Miscount answered 3/1, 2011 at 12:55 Comment(7)
Some do use years first, or lack leading zeroes; see Wikipedia's Date format by country. The French might use jj-mm-aaaa for jour, mois, annee? Italians maybe gg/mm/aaaa for giorno, mese, anno? Germans tt.mm.jjjj for Tag, Monat, Jahr? But then: I guess in most countries only a few languages are used. Like in The Netherlands indeed Windows will often be English or Dutch, not much else. Good enough for me.Cloth
As an aside: another version in Hidden features of Windows batch files is less perfect (needs the fix for the Dutch jj, and does not enforce a 4 digit year), but uses shift to discard the day like Mon or ma. Just different.Cloth
It breaks on a German system. Year and month work, but day fails because "day" starts with a "T" in German ("Tag"), not a "d". The format string in the prompt is (TT-MM-JJ), the date/t output is 23.06.2012. /cc @ClothIrizarry
Another aside: one could also get the order from the registry, using reg query "HKCU\Control Panel\International" /vShortDate. Beware while testing: for an open command prompt, changing that Control Panel setting also changes the format used to display the date (for both date and date /t and echo %date%), but on Windows 7 does NOT change the format for the new date! Like changing my short date format into YY/MM/dd, gets me: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Opening a new command prompt fixes that.Cloth
Arjan, balpha, thanks for the excellent comments. That was really what I was after.Miscount
@Cloth this should be reg query "HKCU\Control Panel\International" /v sShortDate.Apnea
You're right, @tricasse. Not sure if it worked like I wrote in 2012, but surely today my comment is wrong. Too bad I cannot edit my comment ;-)Cloth
G
6

This is what I've used:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

If you want further ideas for automating backups to 7-Zip archives, I have a free/open project you can use or review for ideas: http://wittman.org/ziparcy/

Gay answered 14/10, 2008 at 22:29 Comment(2)
On my system %date% contains "Tue 10/14/2008". So, you'll still need to cut off (or otherwise deal with) the "Tue" and the space character.Evin
Hi @micahwittman. Is it possible to load files with created date using xp_cmdshell in SQL Server ? I have tried "forfiles" command but to no avail. I have asked a question on stackoverflow, please kindly see the link @ https://mcmap.net/q/22640/-how-to-load-files-according-to-created-date-in-windows-command-shell-via-sql-server-39-s-xp_cmdshell/3327081Astilbe
M
6

And here is a similar batch-file for the time portion.

:: https://mcmap.net/q/22637/-how-do-i-get-current-date-time-on-the-windows-command-line-in-a-suitable-format-for-usage-in-a-file-folder-name
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

--jeroen

Miscount answered 3/1, 2011 at 13:26 Comment(3)
Hi, I was able to load files according to Modified date using a command below, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” But I wanna know how to load files according to Created date. Any help would be very appreciated. A question’s been asked on stackoverflow but no answer yet. Please take a look at the link for the details https://mcmap.net/q/22640/-how-to-load-files-according-to-created-date-in-windows-command-shell-via-sql-server-39-s-xp_cmdshell/3327081Astilbe
Ask a new question about that. I've never used forfiles.Miscount
this doens't work on any NT/2k machine independent of regional time settings because %time% is locate dependent. And SETLOCAL ENABLEEXTENSIONS is redundant because extensions are enabled by defaultCataclinal
E
6

A function that is based on wmic:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

Upside: Region independent. Downside: Only system administrators can run wmic.exe.

Usage:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

This echos a string like this:

2014-01-22 12:51:53

Note that function parameters are out-Parameters - that is, you must supply variable names instead of values.

All parameters are optional, so call:Now Y M is a valid call if you only want to get year and month.

Execration answered 22/1, 2014 at 11:59 Comment(0)
C
5

Combine Powershell into a batch file and use the meta variables to assign each:

@echo off
for /f "tokens=1-6 delims=-" %%a in ('PowerShell -Command "& {Get-Date -format "yyyy-MM-dd-HH-mm-ss"}"') do (
    echo year: %%a
    echo month: %%b
    echo day: %%c
    echo hour: %%d
    echo minute: %%e
    echo second: %%f
)

You can also change the the format if you prefer name of the month MMM or MMMM and 12 hour to 24 hour formats hh or HH

Calcific answered 13/7, 2020 at 11:21 Comment(0)
L
4

http://sourceforge.net/projects/unxutils/files/

Look inside the ZIP file for something called "Date.exe" and rename it "DateFormat.exe" (to avoid conflicts).

Put it in your Windows system32 folder.

It has a lot of "date output" options.

For help, use DateFormat.exe --h

I'm not sure how you would put its output into an environment variable... using SET.

Limit answered 31/10, 2010 at 4:45 Comment(1)
Thanks, although this question is specifically for doing it without downloading additional tools.Mattheus
W
4

I had a similar problem. I have an automatic daily download from an FTP server of an encrypted file. I wanted to decrypt the file using gpg, rename the file to the current date (YYYYMMDD format) and drop the decrypted file into a folder for the correct department.

I went through several suggestions for renaming the file according to date and was having no luck until I stumbled upon this simple solution.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

It worked perfectly (i.e., the filename comes out as "2011-06-14.txt").

(Source)

Wenwenceslaus answered 14/6, 2011 at 19:2 Comment(1)
no it doesn't work, let alone perfectly. %date% is locale dependent. There are locale independent ways in the other answersCataclinal
L
3

Regional independent solution generating the ISO date format:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

What could still be optimized: Other processes might get confused if using the date format in the short period while it is modified. So parsing the output according to the existing format string could be 'safer' - but will be more complicated

Langham answered 6/9, 2011 at 12:9 Comment(1)
you could reg query iDate (technet.microsoft.com/en-us/library/cc978637.aspx) and conditionally proceed (3 possible values according to technet) - although I have not tried this yet.Essie
M
2
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF "%%~L"=="" goto  _WMIC_done_
        set _yyyy=%%L
        set _mm=00%%J
        set _dd=00%%G
        set _hour=00%%H
        set _minute=00%%I
        set _second=00%%K
)
:_WMIC_done_

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd
Mankind answered 10/5, 2017 at 22:23 Comment(0)
H
0
  • I used date.exe, and renamed it to date_unxutils.exe to avoid conflicts.

  • Put it inside bin folder next to the batch script.

Code

:: Add binaries to temp path
IF EXIST bin SET PATH=%PATH%;bin

:: Create UTC Timestamp string in a custom format
:: Example: 20210128172058
set timestamp_command='date_unxutils.exe -u +"%%Y%%m%%d%%H%%M%%S"'
FOR /F %%i IN (%timestamp_command%) DO set timestamp=%%i
echo %timestamp%

Download UnxUtils

References

  • This awesome answer that I build upon.
Histolysis answered 28/1, 2021 at 19:17 Comment(0)
M
0

PowerShell Try the code below. It will create the file or folder varible with the date as ddmmyyhhmm in 24hour time

[int] $day = Get-Date -UFormat %d
[int] $month = Get-Date -UFormat %m
[int] $year = Get-Date -UFormat %y
[String] $date = "$($day)$($month)$($year)"
$time = Get-Date -UFormat %R
$time -replace ‘[:]’,”"
$fileFolderName = $date + time
Malacostracan answered 4/11, 2021 at 2:14 Comment(2)
why on earth do you do separate Get-Dates when you can simply use Get-Date -Format "%d%m%y"? And dates in file names should always be in YMD format, not DMY, so that it automatically sorts lexicographically. Another thing is that you got the quotes completely wrong: ‘[:]’,”" => '[:]',""Cataclinal
the better way for filenames is Get-Date -Format "yyyyMMdd_HHmmss"Cataclinal
D
-1

Given a known locality, for reference in functional form. The ECHOTIMESTAMP call shows how to get the timestamp into a variable (DTS in this example.)

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

And saved to file, timestamp.bat, here's the output:

enter image description here

Densimeter answered 11/8, 2016 at 20:7 Comment(8)
It seems that this comes with the regional issue - this doesn't work in all English machines.Natch
Not surprised, @SteveFest . If it were possible to temporarily set the locale, that might help to provide a global solution, but it seems it's necessary to the know the region in advance. Is your locale en-US or en-SomewhereElse?Densimeter
@SteveFest I suppose it would be possible to build up a list of locales where each includes date/time expressions with a sample to validate. I'm super busy, but I'll try to update my answer to illustrate. Could you show me samples of the HK time/date outputs? I may be foolishly assuming zh-HK prints digits at fixed offsets.Densimeter
zh-HK: (yy)yy年m月d日 hh:mm - no leading zeros. (yy) could be ignore as we have 2 digit year, or 4 digit year. But please note one thing: the date time format can be changed per machine.Natch
Thanks @SteveFest, I'll follow up within a few weeks. Run systeminfo at the CLI and let me know what you see for System Locale. The program takes time to run, but maybe the locale result could be cached and subsequently used to index a timestamp format.Densimeter
my PC just died :(Natch
My PC is back - the locale is zh-HKNatch
don't use %date% and %time% which are locale-dependentCataclinal
G
-1

With Windows 7, this code works for me:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%
Grath answered 16/8, 2016 at 10:44 Comment(2)
And again. It's nice that it works on your machine, but you missed the point independent of the regional settings of the machineObscurant
%date% and %time% are locale-dependent and doesn't answer the question at allCataclinal
H
-3

I know that there are numerous ways mentioned already. But here is my way to break it down to understand how it is done. Hopefully, it is helpful for someone who like step by step method.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016
Heathenry answered 15/8, 2016 at 15:57 Comment(1)
You missed the point independent of the regional settings of the machineObscurant
F
-3

I note that the o/p did not ask for a region-independent solution. My solution is for the UK though.

This is the simplest possible solution, a 1-line solution, for use in a Batch file:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%

This solution can be varied, by altering the order of the variables %%A %%B and %%C in the output statement, to provide any date format desired (e.g. YY-MM-DD or DD-MM-YY).

My intention - my ONLY intention - in posting this answer is to demonstrate that this can be done on the command line, by using a single line of code to achieve it.

And that it is redundant to post answers running to 35 lines of code, as others have done, because the o/p specifically asked for a command line solution in the question. Therefore the o/p specifically sought a single-line solution.

Flatfish answered 6/12, 2018 at 10:13 Comment(7)
He mentioned a region independent solution ...particularly because of the regional settings issue with using date. Btw. Your solution is the same as the twenty other answers.Obscurant
Yeah, but mine actually could (optionally) be used on the command line. What is the merit in posting 35 lines of code, if one line of code will provide the same solution?Flatfish
I can't see any relevant difference to the old answers of @Matthew Johnson, 2010 or @KChiki, 2011Obscurant
even though this answer is incorrect, to comment on the actual answr, a for loop is not needed here when you could have simply done echo %date:/=-%Calcific
No. If you omit the FOR loop, no variables can be created, and the date which you have taken the trouble to extract is still useless. With the FOR loop, the variables created by the loop are available to use in other parts of the script. I strongly deprecate using dozens of lines of code to create the FOR loop, when only 1 line is required. And I strongly deprecate posting non-command line solutions, where the o/p specifically asked for a one-line solution for use on the command line.Flatfish
My solution is so short that it can be used as the first part of a Command line, where the remainder of the command can make use of the created variables.Flatfish
FOR /F "tokens=1-3 delims=/" %A IN ("%date%") DO (SET today=%C-%B-%A) && echo %A-%B-%C && echo %today%Flatfish

© 2022 - 2024 — McMap. All rights reserved.