如何在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.exe(UnxUtils的一部分)以任何可考虑的格式提供任何日期和时间信息。您也可以使用来从任何文件中提取日期/时间信息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下载(v1,v2,v3(仅适用于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的增强功能,因为并非所有语言环境都使用字符串dd,mm并且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。当心当测试:一个开放的命令提示符下,改变该控制面板也设置更改用于显示日期的格式(用于date与date /t和echo %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.