如何在Windows命令行上以合适的格式获取当前日期/时间以在文件/文件夹名称中使用?


539

更新:现在是2016年,除非有确实令人信服的向后兼容原因,否则我将使用PowerShell,特别是由于using的区域设置问题date。参见@npocmaka的https://stackoverflow.com/a/19799236/8479


什么是Windows命令行语句,我可以用可以放入文件名的格式来获取当前日期时间?

我想要一个.bat文件,该文件将目录压缩到一个存档中,并将当前日期和时间作为名称的一部分,例如Code_2008-10-14_2257.zip。有什么简单的方法可以做到这一点,而与机器的区域设置无关吗?

我不太在乎日期格式,理想情况下是yyyy-mm-dd,但是任何简单的方法都可以。

到目前为止,我已经知道了,这在我的机器上可以给我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

我可以忍受,但是似乎有点笨拙。理想情况下,它会更简短并且具有前面提到的格式。

我正在使用Windows Server 2003和Windows XP Professional。我不想安装其他实用程序来实现此目的(尽管我知道有些工具可以很好地格式化日期)。


7
为代码创建自动备份?对你有益!我们也应该这样做:)
AndreiRînea

24
使用Powershell的人...[datetime]::now.tostring("yyyy-MM-dd")
Nacht-恢复莫妮卡2014年

是否可以在SQL Server中使用xp_cmdshell加载具有创建日期的文件?我问了一个关于stackoverflow的问题,请查看链接@ stackoverflow.com/q/32293517/3327081
kolunar 2015年

Answers:


667

请参阅Windows批处理文件(.bat)以MMDDYYYY格式获取当前日期

@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%

如果您希望使用24小时/军事格式的时间,则可以使用以下命令替换第二条FOR行:

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

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

如果您希望日期独立于区域日/月顺序,则可以使用“ WMIC os GET LocalDateTime”作为来源,因为它采用ISO顺序:

@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
当地日期为[2012-06-19 10:23:47.048]


44
对于英国人,您需要For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)第二行。
罗里

17
此解决方案取决于语言环境,Rory以英国为示例,说明其他语言环境的日期为2012
Nuno Furtado

25
在我的系统上,%TIME%返回诸如“ 0:01:15”和“ 3:15:12”之类的值,答案中的%% a %% b代码给出了诸如“ 001”和“ 315”之类的前导空格。要获得四位数的hhmm,请使用以下命令:For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))该命令返回“ 0001”和“ 0315”之类的值,我希望在其文件名中使用它们。
twamley,2012年

10
不错的wmic命令版本!到目前为止,我只看过WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table。同样,要20120623-1619一行一行到达我所在的阿姆斯特丹时区:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
Arjan 2012年

5
对我来说,他说%%a was unexpected at this time.
Scott zuz22 Blacklock

109

区域独立的日期时间解析

的输出格式%DATE%和的dir命令是区域相关的,因此既不健壮也不智能。date.exeUnxUtils的一部分)以任何可考虑的格式提供任何日期和时间信息。您也可以使用来从任何文件中提取日期/时间信息date.exe

示例:(在cmd脚本中使用%%代替%)

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:任意文本

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

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

参考文件中的日期/时间信息:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

在CMD脚本中使用它来获取年,月,日,时间信息:

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

在CMD脚本中使用它以任何所需的格式获取时间戳:

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

从任何参考文件中提取日期/时间信息。

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

将文件的日期/时间信息添加到文件中:

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是免费的GNU工具的一部分,无需安装。

注意:复制date.exe到搜索路径中的任何目录中可能会导致使用Windows内置date命令的其他脚本失败。


4
比上面奇怪的更流行的解决方案好得多,但是我不得不添加/ t以避免在Windows 8.1上出现提示
rainabba 2014年

6
内置Windows 8.1 date.exe似乎取决于语言环境。它以我的系统上的dd / MM / yyyy返回日期,如果它与语言环境无关,那么我希望是MM / dd / yyyy或yyyy-MM-dd。我不认为此答案是在谈论内置的date.exe,而是它的某些第三方版本。
SSS 2014年

1
它是独立的语言环境,如果你为它提供的命令行上所需的格式
terrinecold

3
请注意,date.exe(UnxUtils的一部分)与内置日期命令不同。因此,如果必须添加/ t,则执行Windows date命令。如果类似date.exe +“%Y-%m-%d”之类的文件有效,则说明您已正确安装UnxUtils。:-)
just.do.it 2014年

是否可以在SQL Server中使用xp_cmdshell加载具有创建日期的文件?我尝试了“ forfiles”命令,但无济于事。我问过一个关于stackoverflow的问题,请查看链接@ stackoverflow.com/q/32293517/3327081
kolunar 2015年

103

另外两种不依赖于时间设置的方式(均来自:How如何获得与本地化无关的数据/时间:)。两者都可以获取星期几,而且都不需要管理员权限!:

  1. MAKECAB-将在每个Windows系统上运行(速度很快,但会创建一个小的临时文件)(foxidrive脚本):

    @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
    

    有关get-date函数的更多信息

  2. ROBOCOPY-这不是Windows XP和Windows Server 2003的本机命令,但可以从Microsoft网站下载。但是内置于Windows Vista及更高版本中的所有内容:

    @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
    

    还有其他三种使用其他Windows脚本语言的方式。它们将为您提供更大的灵活性,例如,您可以获取一年中的某周,毫秒等时间。

  3. JScript /批处理混合(需要另存为.bat)。作为Windows Script Host的一部分,JScript在Windows NT和更高版本的所有系统上均可用尽管可以通过注册表禁用,但这种情况很少见):

    @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混合(是否可以在不使用临时文件的情况下在批处理文件中嵌入和执行VBScript?)与JScript相同,但是混合并不是那么完美:

    :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-可以安装在每台具有.NET的计算机上-从Microsoft下载(v1v2v3(仅适用于Windows 7及更高版本))。默认情况下,它将安装在Windows 7 / Windows Server 2008及更高版本中的所有组件上:

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

    要从批处理文件中使用它,请执行以下操作:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. 自编译的jscript.net/batch(从来没有见过没有.NET的Windows机器,所以我认为这是一个可移植的工具):

    @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这无法获取年份和星期几。它比较慢,并且还会创建一个临时文件,并且基于logman在其日志文件上放置的时间戳。它可以在Windows XP及更高版本的所有操作系统上运行。它可能永远不会被任何人使用-包括我-但还有另一种方式...

    @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. 使用WMIC的另一种方法也可以给出一年中的星期几和一周中的星期几,但是不能给出毫秒(对于毫秒,请检查foxidrive的答案):

    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. 使用TYPEPERF进行一些努力,以使其快速并与不同的语言设置兼容并尽可能快:

    @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允许调用类似于上面#3中演示的JScript方法的JavaScript方法。请记住,涉及月份值的JavaScript的Date对象属性的编号是从0到11,而不是1到12。因此,值9表示十月。

    <!-- : 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>
    

2
for powershell C:\>对于(fpowershell get-date -format“ {yyyyMMdd_HHmmss}”)中的/ f %% i,请设置datetime = %% i C:\> echo%datetime%
Samuel

1
makecab:这是通过创建一个名为文件~.rpt,以及搜索string里面,开头makecab,这就像一条线MakeCAB Report: Tue Sep 02 22:15:57 2014。对我来说,此命令未本地化,它与语言环境无关。这个技巧就是依靠它。希望它永远不会,否则要当心!
n611x007'9

10
我喜欢开头文字“另外两个...”,后面是8个解决方案。
亚当·史密斯

1
什么,没有mshta杂种?:)介意我编辑您的答案并添加一个吗?这似乎是最好的深奥解决方案的集合,似乎mshta属于这里。
rojo 2015年

1
无论我尝试什么,公认的解决方案都对我不起作用。这些解决方案中有很多对我有用。(批处理和Powershell)。
布雷特(Brett)等待

44

这是alt.msdos.batch.nt的一个变体,可独立于本地运行。

将其放在文本文件中,例如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<-------------

为了使代码在stderr上没有错误msg的情况下工作,我必须在%% a,%% b和%% c的变量分配周围添加单引号。我的语言环境(PT)在执行“ set = 20”之类的循环/解析的某一阶段导致错误。引号为赋值语句的左侧产生一个标记(尽管为空)。

缺点是混乱的语言环境变量名称:“ yy”,“ mm”和“ dd”。但是,嘿,谁在乎!


3
这是完美的,并且是迄今为止我见过的最简单,最优雅的方法。
Doug

2
另请参见Jeroen的增强功能,因为并非所有语言环境都使用字符串ddmm并且yy在的输出中也需要echo:^|date
Arjan 2012年

不适用于所有地区。(以德文date给出Geben Sie das neue Datum ein: (TT-MM-JJ),其中包含JJ您要破坏的剧本(期望YY))
斯蒂芬,

35

我用这个(同样不是地区独立的(英国))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%

有关此鲜为人知但非常有效的技术,请参见带有Colon和Tilde的Cmd.exe环境变量。(将提供指向Microsoft权威参考的指针。)
DavidRR

这是Microsoft的Windows XP批处理文件参考。该参考资料包括使用批处理参数。不幸的是,没有讨论“切片”技术。
DavidRR

这对我来说不太有效。也许与区域设置有关?在2014
Joel B

26

此代码的前四行将为您提供Windows XP Professional和更高版本中可靠的YY DD MM YYYY HH Min Sec变量。

@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

完美,这对我来说是最好的解决方案,因为调用PS会使cmd文本的外观变得有趣。
Ste

25

不幸的是,这不能不受区域设置的影响,但是可以满足您的要求。

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%

您可以在Wikipedia上找到惊人的东西。


1
标记 - 使用Colon和Tilde找到了Cmd.exe环境变量,它描述了答案中显示的变量“切片”技术。在Wikipedia文章中找不到该信息。想从Microsoft找到权威参考。
DavidRR

1
这是Microsoft的Windows XP批处理文件参考。该参考资料包括使用批处理参数。不幸的是,没有讨论“切片”技术。
DavidRR

18

请使用以下脚本在命令行中获取当天:

echo %Date:~0,3%day

8
玩了一下,这是我发现的最短的日期和时间:echo%date%%time%
loomi 2012年

15

另一种方式(功劳):

@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%

请注意,我的两个答案仍然取决于地区设置所确定的日期和月份的顺序-不知道如何解决。


14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip

http://www.dotnetperls.com/7-zip-examples有一些优点可能对将来的某人有用。
Saravanan

13

这并不是很简单,但是可能是更灵活的方式(信誉):

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%

10

这是一种在一行中获取日期时间的方法:

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

在美国,这将输出“ yyyy-mm-dd hhmm”。不同的区域设置将导致不同的%date%输出,但是您可以修改令牌顺序。

如果要使用其他格式,请通过重新排列标记或使用其他(或不使用)分隔符来修改echo语句。


有没有一种方法可以获取12小时格式的时间并显示AM或PM信息?
Sangli


9

简短答案:

 :: 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 

长答案

    @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

::在('PowerShell -Command“ get-date” -format“ yyyyMMdd”')的/ f%i的cmd中设置yyyyMMdd =%i ::(/'PowerShell -Command的/ f %% i的cmd脚本“ get-date” -format“ yyyyMMdd”')确实设置yyyyMMdd = %% i
Yordan Georgiev

8

马修·约翰逊(Matthew Johnson)的单线解决方案,以获取单线日期和时间是雄辩的而有用的。

但是,它确实需要进行简单的修改才能在批处理文件中工作:

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

1
在CMD中(此时%% a意外)或在PowerShell中(在Windows 8.1上缺少打开'('在关键字之后))
不起作用

3
Rainabba,这正是从CMD行发出该命令时得到的错误。但是,“ 从批处理文件中 ”命令将返回“ 2014-01-30 1324”。
约翰·朗斯塔夫

1
或没有for循环会更简单echo %date:/=-%%time::=-%
Gerhard Barnard,

7

这是时间部分的类似批处理文件。

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: 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


嗨,我能够使用以下命令根据修改日期加载文件,z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” 但是我想知道如何根据创建日期加载文件。任何帮助将不胜感激。有人问了一个关于stackoverflow的问题,但还没有答案。请查看链接以获取详细信息stackoverflow.com/q/32293517/3327081
kolunar 2015年

1
提出一个新的问题。我从没用过forfiles
Jeroen Wiert Pluimers

7

我使用vMax的批处理文件更改了答案,因此它也适用于荷兰语。 荷兰-执着,因为我们是-必须在几个变化,和
%date%date/tdate那个破原来的批处理文件。

如果有人也可以对照其他Windows区域设置检查此结果并报告结果,那将是很好的。
如果批处理文件在您所在的位置失败,则请在命令提示符下包括以下两个语句的输出:
echo:^|date
date/t

这是您应该从批处理文件中获得的输出的示例:

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

这是经过修改的代码,其中包含有关原因的注释:

:: /programming/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by jeroen@pluimers.com 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


2
有些人确实先使用年份,或者缺少前导零。请参阅Wikipedia的国家/地区日期格式。法国威力使用jj-mm-aaaa的怨妇,杂物车,ANNEE?意大利人可能会gg/mm/aaaa喜欢giorno,mese,anno?tt.mm.jjjjTag,Monat,Jahr的德国人?但是然后:我想在大多数国家中,只会使用几种语言。就像在荷兰一样,Windows的确通常会是英语或荷兰语,仅此而已。对我来说足够好了。
Arjan 2012年

2
顺便说一句:Windows批处理文件的隐藏功能的另一个版本不太完美(需要针对荷兰语的修复程序jj,并且不强制使用4位数字的年份),但用于shift舍弃诸如Mon或的日期ma。只是不同。
Arjan 2012年

4
它打破了德国的体系。年月工作,但日失败,因为“日”以德语的“ T”(“ Tag”)开头,而不是“ d”。提示中的格式字符串为(TT-MM-JJ)date/t输出为23.06.2012。/ cc @Arjan
balpha

2
除此以外:还可以使用来从注册表中获取订单reg query "HKCU\Control Panel\International" /vShortDate。当心当测试:一个开放的命令提示符下,改变该控制面板也设置更改用于显示日期的格式(用于datedate /techo %date%),但在Windows 7不会改变格式,新的日期!就像将我的短日期格式更改为YY/MM/dd,会使我:The current date is: 12/06/23 Enter the new date: (mm-dd-yy)。打开新的命令提示符即可解决此问题。
Arjan 2012年

2
@Arjan应该是reg query "HKCU\Control Panel\International" /v sShortDate
tricasse 2015年

6

这是我用过的:

::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:-=.%

如果您想进一步了解如何自动备份7-Zip存档,我有一个免费的/开放的项目,您可以使用或查看它的想法:http : //wittman.org/ziparcy/


在我的系统上,%date%包含“ Tue 10/14/2008”。因此,您仍然需要剪裁(或处理)“ Tue”和空格字符。
BoltBait

嗨@micahwittman。是否可以在SQL Server中使用xp_cmdshell加载具有创建日期的文件?我尝试了“ forfiles”命令,但无济于事。我已经问过关于stackoverflow的问题,请查看链接@ stackoverflow.com/q/32293517/3327081
kolunar 2015年

5

我有一个类似的问题。我每天从FTP服务器自动下载一个加密文件。我想使用gpg解密文件,将文件重命名为当前日期(YYYYMMDD格式),然后将解密后的文件放入正确部门的文件夹中。

我经历了一些有关根据日期重命名文件的建议,直到碰巧找到这个简单的解决方案之前,我没有走运。

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

它运行完美(即文件名显示为“ 2011-06-14.txt”)。

(资源)


5

基于以下功能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

上行:独立于地区。缺点:只有系统管理员才能运行wmic.exe。

用法:

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

这回显了这样的字符串:

2014-01-22 12:51:53

请注意,函数参数是out-Parameters-也就是说,您必须提供变量名而不是值。

所有参数都是可选的,因此,call:Now Y M如果您只想获取年份和月份,那么这是一个有效的调用。


4

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

在ZIP文件中查找名为“ Date.exe”的文件,并将其重命名为“ DateFormat.exe”(以避免冲突)。

将其放在Windows system32文件夹中。

它具有许多“日期输出”选项。

如需帮助,请使用 DateFormat.exe --h

我不确定如何使用SET将其输出放入环境变量中。


1
谢谢,尽管这个问题是专门为解决此问题而无需下载其他工具的。
罗里

3

生成ISO日期格式的区域独立解决方案:

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:

仍然可以优化的内容:如果在修改日期后的短时间内使用日期格式,其他过程可能会感到困惑。因此,根据现有格式字符串解析输出可能会“更安全”-但会更加复杂


您可以注册查询iDate(technet.microsoft.com/en-us/library/cc978637.aspx)并有条件地进行操作(根据technet,可能有3个值)-尽管我尚未尝试过。
文森特·德·斯梅特

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 adolfo.dimare@gmail.com
:: - 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

0

给定已知的位置,以功能形式提供参考。该ECHOTIMESTAMP调用显示了如何将时间戳记转换为变量(DTS在此示例中。)

@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

并保存到文件timestamp.bat,结果如下:

在此处输入图片说明


看来这是地区性问题-并非在所有英语机器上都有效。

不奇怪,@SteveFest。如果可以临时设置区域设置,则可能有助于提供全局解决方案,但似乎有必要提前了解该区域。您的语言环境是美国还是其他地方?
bvj

@SteveFest我想可以建立一个语言环境列表,其中每个语言环境都包含日期/时间表达式,并带有一个示例进行验证。我非常忙,但是我将尝试更新答案以进行说明。您能给我看一下香港时间/日期输出的样本吗?我可能会愚蠢地假设zh-HK以固定的偏移量打印数字。
bvj

zh-HK:(yy)yy年m月d日 hh:mm-没有前导零。(yy),因为我们有2位数字年份或4位数字年份,所以可以忽略。但请注意一件事:日期时间格式可以在每台机器上更改。

感谢@SteveFest,我将在几周后跟进。systeminfo在CLI上运行,让我知道您看到了什么System Locale。该程序需要花费一些时间才能运行,但可能会缓存区域设置结果,然后将其用于索引时间戳格式。
bvj

0

在Windows 7中,此代码适用于我:

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%

然后再次。很高兴它可以在您的机器上运行,但您错过了要点independent of the regional settings of the machine
jeb

-1

我注意到,O / P做要求独立于区域的解决方案。我的解决方案是针对英国的。

这是在批处理文件中使用的最简单的解决方案,即1行解决方案:

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

2
他提到了与地区无关的解决方案...particularly because of the regional settings issue with using date。顺便说一句。您的解决方案与其他二十个答案相同。
jeb

是的,但是我的实际上可以(可选)在命令行上使用。如果一行代码可以提供相同的解决方案,那么发布35行代码的优点是什么?
Ed999


即使这个答案不正确,也可以在实际的answr上发表评论,只要您可以简单地完成操作,就不需要在这里进行for循环echo %date:/=-%
Gerhard Barnard,

否。如果省略FOR循环,则无法创建任何变量,并且麻烦提取的日期仍然没有用。使用FOR循环,可以在脚本的其他部分中使用由循环创建的变量。当只需要一行时,我强烈反对使用数十行代码来创建FOR循环。而且我强烈反对发布非命令行解决方案,在这种情况下,o / p专门要求在命令行上使用单行解决方案。
Ed999

-3

我知道已经提到了很多方法。但是,这是我将其分解以了解如何完成的方法。希望对喜欢逐步方法的人有所帮助。

:: 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

3
您错过了重点independent of the regional settings of the machine
jeb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.