首页 文章

在Windows批处理脚本中格式化日期和时间

提问于
浏览
163

在Windows(Windows XP)批处理脚本中,我需要格式化当前日期和时间,以便以后在文件名中使用等 .

它类似于Stack Overflow问题How to append a date in batch files,但也有时间 .

到目前为止我有这个:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

这使:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

有没有办法允许%TIME%的单个数字小时,所以我可以得到以下内容?

2009_07_28__08_36_01

30 回答

  • 3

    我最终得到了这个脚本:

    set hour=%time:~0,2%
    if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
    echo hour=%hour%
    set min=%time:~3,2%
    if "%min:~0,1%" == " " set min=0%min:~1,1%
    echo min=%min%
    set secs=%time:~6,2%
    if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
    echo secs=%secs%
    
    set year=%date:~-4%
    echo year=%year%
    

    ::在WIN2008R2上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现

    set month=%date:~4,2%
    if "%month:~0,1%" == " " set month=0%month:~1,1%
    echo month=%month%
    set day=%date:~0,2%
    if "%day:~0,1%" == " " set day=0%day:~1,1%
    echo day=%day%
    
    set datetimef=%year%%month%%day%_%hour%%min%%secs%
    
    echo datetimef=%datetimef%
    
  • 27
    @ECHO OFF
    : Sets the proper date and time stamp with 24Hr Time for log file naming
    : convention
    
    SET HOUR=%time:~0,2%
    SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
    SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
    
    if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)
    
    ECHO %dtStamp%
    
    PAUSE
    
  • 29

    以下是我生成日志文件名的方法(基于http://ss64.com/nt/syntax-getdate.html):

    @ECHO OFF
    :: Check WMIC is available
    WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error
    
    :: Use WMIC to retrieve date and time
    FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
       IF "%%~L"=="" goto s_done
          Set _yyyy=%%L
          Set _mm=00%%J
          Set _dd=00%%G
          Set _hour=00%%H
          SET _minute=00%%I
          SET _second=00%%K
    )
    :s_done
    
    :: Pad digits with leading zeros
          Set _mm=%_mm:~-2%
          Set _dd=%_dd:~-2%
          Set _hour=%_hour:~-2%
          Set _minute=%_minute:~-2%
          Set _second=%_second:~-2%
    
    Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
    goto make_dump
    
    :s_error
    echo WMIC is not available, using default log filename
    Set logtimestamp=_
    
    :make_dump
    set FILENAME=database_dump_%logtimestamp%.sql
    ...
    
  • 6

    如果安装了PowerShell,那么您可以轻松可靠地以您想要的任何格式获取日期/时间,例如:

    for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
    move "%oldfile%" "backup-%datetime%"
    

    当然,现在总是安装PowerShell,但是在Windows XP上,如果您的批处理脚本在知道PS可用的已知环境中使用(或者如果PowerShell可用,则检查批处理文件),您可能只想使用此技术 . ...)

    您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS .

  • 1

    每当我需要日期/时间字符串时,我通常会这样做:

    set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
    set dt=%dt: =0%
    

    这是德国日期/时间格式(dd.mm.yyyy hh:mm:ss) . 基本上我连接子串并最终用零替换所有空格 .

    简短解释子串如何工作:

    %VARIABLE:~num_chars_to_skip,num_chars_to_keep%
    

    因此,从“29.03.2018”之类的日期开始,只需使用:

    %DATE:~6,4%
           ^-----skip 6 characters
             ^---keep 4 characters
    
  • 2

    我今天遇到了这个问题并解决了它:

    SET LOGTIME=%TIME: =0%
    

    它用0替换空格,基本上是零填充小时 .

    经过一些快速搜索后,我没有发现它是否需要命令扩展(仍然使用SETLOCAL DISABLEEXTENSIONS) .

  • 0

    如前所述,解析日期和时间仅在您知道当前用户使用的格式时才有用(例如,MM / dd / yy或dd-MM-yyyy仅命名为2) . 这可以确定,但是当你进行所有压力和解析时,你仍然会遇到一些使用了意外格式的情况,并且需要进行更多调整 .

    您还可以使用一些外部程序,它将以您的首选格式返回日期slug,但这样做的缺点是需要使用您的脚本/批处理分发实用程序 .

    还有一些以非常原始的方式使用CMOS时钟的批处理技巧,但对于大多数人来说,它太接近于裸线,并且也不总是检索日期/时间的首选位置 .

    以下是避免上述问题的解决方案 . 是的,它引入了一些其他问题,但出于我的目的,我发现这是在现代Windows系统的.bat文件中创建日期戳的最简单,最清晰,最便携的解决方案 . 这只是一个例子,但我想你会看到如何修改其他日期和/或时间格式等 .

    reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
    reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
    @REM reg query "HKCU\Control Panel\International" /v sShortDate
    set LogDate=%date%
    reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
    
  • 32

    以下可能不是一个直接的答案,而是一个接近的答案?

    set hour=%time:~0,2%
    if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
    else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
    

    至少它可能是鼓舞人心的 .

  • 3

    如果您不完全需要这种格式:

    2009_07_28__08_36_01
    

    然后你可以使用以下使用%date%和%time%的 3 lines of code

    set mydate=%date:/=%
    set mytime=%time::=%
    set mytimestamp=%mydate: =_%_%mytime:.=_%
    

    注意:字符 /: 将被删除,字符 . 和空格将替换为下划线 .

    示例输出(2015年5月8日星期三下午12:49,50秒和93毫秒):

    echo %mytimestamp%
    Wed_08052015_124950_93
    
  • 2
    REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
    REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
    REM If first character of time is a space (less than 1) then set DATETIME to:
    REM YYYY-MM-DD-0h-mm-ss
    REM Otherwise, set DATETIME to:
    REM YYYY-MM-DD-HH-mm-ss
    REM Year, month, day format provides better filename sorting (otherwise, days grouped
    REM together when sorted alphabetically).
    
    IF "%time:~0,1%" LSS "1" (
       SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
    ) ELSE (
       SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
    )
    
    ECHO %DATETIME%
    
  • 2

    Windows中的 SET 命令支持的 offset:length 格式不允许您填充 0 ,因为您似乎对此感兴趣 .

    但是,您可以编写BATCH脚本以检查小于 10 的小时
    用相应的 echo 字符串填充 .

    你会发现一些information on the SET command on this link .


    你也可以改用其他编程方法来到这里 .

    unix bash(Windows上的Cygwin提供)非常简单,只是说,

    date +%Y_%m_%d__%H_%M_%S
    

    而且,它总是正确填充 .

  • 8

    我是这样做的:

    REM Generate FileName from date and time in format YYYYMMTTHHMM
    
    Time /T > Time.dat
    set /P ftime= < Time.dat
    
    set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log
    
    echo %FileName%
    

    LogFile201310170928.log

  • 1

    要生成 YYYY-MM-DD hh:mm:ss (24小时)时间戳,我使用:

    SET CURRENTTIME=%TIME%
    IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
    FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)
    
  • 0
    ::========================================================================  
    ::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
    ::======= ================================================================  
    FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
    SET DATETIME=%DTS:~0,8%-%DTS:~8,6%
    

    第一行始终以这种格式输出时区:
    20150515150941.077000 120
    这样您只需格式化输出即可满足您的愿望 .

  • 0
    set hourstr = %time:~0,2%
    if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
    set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%
    
  • 133

    创建一个名为“search_files.bat”的文件,并将下面的内容放入文件中 . 然后双击它 . 临时%THH%变量用于适当处理AM . 如果当前的前2位数字中有0,则Windows将忽略LOG文件的其余文件名 .

    CD .
    SET THH=%time:~0,2%
    SET THH=%THH: =0%
    dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG
    
  • 0

    这个批处理脚本将完全符合O.P.的要求(在Windows XP SP3上测试) .

    我还使用了之前由"jph"描述的聪明的注册表技巧,其中恕我直言,这是在任何新旧系统上将日期100%一致格式化为 "yyyy_MM_dd" 的最简单方法 . 为执行此操作而更改为一个注册表值是暂时的,无关紧要的;它只会持续几毫秒才能立即恢复 .

    双击此批处理文件进行即时演示,将弹出命令提示符窗口并显示您的时间戳 . . . . .

    @ECHO OFF
    SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A
    TITLE GENERATE A CUSTOM FORMATTED TIMESTAMP USING %%DATE%% AND %%TIME%% COMMANDS
    
    :: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
    REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
    REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul
    SET MYDATE=%date%
    :: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
    REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
    REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul
    
    :: --- SPLIT THE TIME DIGITS TO THREE BLOCKS [H] [MM] [SS.SS]
    FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO SET HOUR=%%A& SET MINUTES=%%B& SET SECONDS=%%C
    
    :: --- YOUR CHOICE - FOR 4 DIGIT SECONDS - REMOVES THE DOT FROM THE SECONDS BLOCK [SS.SS]
    :: SET SECONDS=%SECONDS:.=%
    :: --- YOUR CHOICE - FOR 2 DIGIT SECONDS - GETS THE FIRST TWO DIGITS FROM THE SECONDS BLOCK [SS.SS]
    SET SECONDS=%SECONDS:~0,2%
    
    :: --- GET THE "AM PM" STRING TO CHECK THE HOUR BLOCK
    FOR /F "tokens=1,2 delims= " %%A IN ('time /t') DO SET AM_PM=%%B  
    
    :: --- CONVERT THE HOUR BLOCK [H] TO "24 HOUR" FORMAT [HH]
    IF %AM_PM%==PM (
    IF %HOUR%==01 (SET HOUR=13)
    IF %HOUR%==02 (SET HOUR=14)
    IF %HOUR%==03 (SET HOUR=15)
    IF %HOUR%==04 (SET HOUR=16)
    IF %HOUR%==05 (SET HOUR=17)
    IF %HOUR%==06 (SET HOUR=18)
    IF %HOUR%==07 (SET HOUR=19)
    IF %HOUR%==08 (SET HOUR=20)
    IF %HOUR%==09 (SET HOUR=21)
    IF %HOUR%==10 (SET HOUR=22)
    IF %HOUR%==11 (SET HOUR=23)
    ) ELSE (
    IF %HOUR%==12 (SET HOUR=00)
    IF %HOUR%==1 (SET HOUR=01)
    IF %HOUR%==2 (SET HOUR=02)
    IF %HOUR%==3 (SET HOUR=03)
    IF %HOUR%==4 (SET HOUR=04)
    IF %HOUR%==5 (SET HOUR=05)
    IF %HOUR%==6 (SET HOUR=06)
    IF %HOUR%==7 (SET HOUR=07)
    IF %HOUR%==8 (SET HOUR=08)
    IF %HOUR%==9 (SET HOUR=09)
    )
    
    :: --- GENERATE OUR WANTED TIMESTAMP
    ECHO. & ECHO.
    SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%
    ECHO    Your timestamp is:    %TIMESTAMP%
    
    :: --- WAIT - VIEW THE RESULT IN THE CONSOLE SCREEN
    ECHO. & ECHO.
    ECHO    Job is done. Press any key to exit . . .
    PAUSE > NUL
    
    EXIT
    
  • 2

    此bat文件(另存为datetimestr.bat)生成日期时间字符串3次:(1)长日期时间字符串,星期几和秒,(2)短日期时间字符串,不带它们,(3)短代码 .

    @echo off
    REM "%date: =0%" replaces spaces with zeros
    set d=%date: =0%
    REM "set yyyy=%d:~-4%" pulls the last 4 characters
    set yyyy=%d:~-4%
    set mm=%d:~4,2%
    set dd=%d:~7,2%
    set dow=%d:~0,3%
    set d=%yyyy%-%mm%-%dd%_%dow%
    
    set t=%TIME: =0%
    REM "%t::=%" removes semi-colons
    REM Instead of above, you could use "%t::=-%" to 
    REM replace semi-colons with hyphens (or any 
    REM non-special character)
    set t=%t::=%
    set t=%t:.=%
    
    set datetimestr=%d%_%t%
    @echo  Long date time str = %datetimestr%
    
    set d=%d:~0,10%
    set t=%t:~0,4%
    set datetimestr=%d%_%t%
    @echo Short date time str = %datetimestr%
    
    
    @REM Short version of the code above
    set d=%date: =0%
    set t=%TIME: =0%
    set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
    @echo Datetimestr = %datetimestr%
    
    pause
    

    为了给予适当的信任,我合并了Peter Mortensen(2014年6月18日21:02)和opello(2011年8月25日14:27)的概念 .

    你可以写得更短,但是这个长版本使得阅读和理解代码变得容易 .

  • 0

    我喜欢@The lorax上的短版本,但对于其他语言设置,它可能会略有不同 .

    例如,在德语设置中(使用自然日期格式:dd.mm.yyyy),月份查询必须从4,2更改为3,2:

    @ECHO OFF
    : Sets the proper date and time stamp with 24h time for log file naming convention i.e.
    
    SET HOUR=%time:~0,2%
    SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
    SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
    
    if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)
    
    ECHO %dtStamp%
    : Outputs= 20160727_081040
    : (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)
    
    PAUSE
    
  • 63

    我'm really new to batch files and this is my code!! (I am not sure why, but I couldn' t将 date /ttime /t 组合在一起,我不能直接使用 %date%%time% 而没有变量...)

    @ECHO OFF
    set ldt=%date% %time%
    echo %ldt%>> logs.txt
    EXIT
    

    它是从其他人那里重用的(问题是要将格式化的时间日期用作文件名) .

  • 1

    这是 datetime string 的2美分 . 在 MM DD YYYY 系统上,切换第一个和第二个 %DATE:~ 条目 .

    REM ====================================================================================
        REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
        REM ====================================================================================
        REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
        REM ====================================================================================
        REM CHECK for SHORTDATE dd DDxMMxYYYY 
        IF "%DATE:~0,1%" GTR "3" (
            SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        ) ELSE (
        REM ASSUMES SHORTDATE DDxMMxYYYY
            SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
            )
        REM CORRECT FOR HOURS BELOW 10
        IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
        ECHO %DATETIME%
    
  • 20

    我尝试了接受的答案,效果很好 . 不幸的是,美国时间格式似乎是H:MM:SS.CS,前面缺少的0导致解决问题在上午10点之前 . 为了克服这个障碍并且还允许解析大多数世界时间格式,我想出了这个看起来效果很好的简单例程 .

    :ParseTime
    rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
    FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
    GOTO :EOF
    

    这个例程的好处是你将时间字符串作为第一个参数和要包含时间(以厘秒为单位)的环境变量的名称作为第二个参数传递 . 例如:

    CALL :ParseTime %START_TIME% START_CS
    CALL :ParseTime %TIME% END_CS
    SET /A DURATION=%END_CS% - %START_CS%
    

    克里斯

  • 8

    也许是这样的:

    @call:DateTime
    
    @for %%? in (
        "Year   :Y"
        "Month  :M"
        "Day    :D"
        "Hour   :H"
        "Minutes:I"
        "Seconds:S"
    ) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_
    
    :: OUTPUT
    :: Year    : _DT_Y_ : 2014
    :: Month   : _DT_M_ : 12
    :: Day     : _DT_D_ : 17
    :: Hour    : _DT_H_ : 09
    :: Minutes : _DT_I_ : 04
    :: Seconds : _DT_S_ : 35
    
    @pause>nul
    
    @goto:eof
    
    :DateTime
        @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
        @if not errorlevel 1 (
            @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
        ) else (
            @set "_DT_T_=1234567890 "
        )
        @if errorlevel 1 (
            @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
            @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
            @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
        )
        @if errorlevel 1 (
            @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
            @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
            @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
            @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
        )
        @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
        @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
    @exit/b
    
  • 5

    还有另一种简单的方法:

    set HH=%time:~0,2%
    if %HH% LEQ 9 (
    set HH=%time:~1,1%
    )
    
  • 2
    :: =============================================================
    :: Batch file to display Date and Time seprated by undescore.
    :: =============================================================
    :: Read the system date.
    :: =============================================================
    @SET MyDate=%DATE%
    @SET MyDate=%MyDate:/=:%
    @SET MyDate=%MyDate:-=:%
    @SET MyDate=%MyDate: =:%
    @SET MyDate=%MyDate:\=:%
    @SET MyDate=%MyDate::=_%
    :: =============================================================
    :: Read the system time.
    :: =============================================================
    @SET MyTime=%TIME%
    @SET MyTime=%MyTime: =0%
    @SET MyTime=%MyTime:.=:%
    @SET MyTime=%MyTime::=_%
    :: =============================================================
    :: Build the DateTime string.
    :: =============================================================
    @SET DateTime=%MyDate%_%MyTime%
    :: =============================================================
    :: Display the Date and Time as it is now.
    :: =============================================================
    @ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
    :: =============================================================
    :: Wait before close.
    :: =============================================================
    @PAUSE
    :: =============================================================
    
  • 1

    对于在文件名中使用的数字日期的简单解决方案,请使用以下代码:

    set month=%date:~4,2%
    set day=%date:~7,2%
    set curTimestamp=%month%%day%%year%
    
    rem then the you can add a prefix and a file extension easily like this
    echo updates%curTimestamp%.txt
    
  • 2

    用斜杠拆分date命令的结果,然后可以将每个标记移动到适当的变量中 .

    FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
    SET _Month=%%a
    SET _Day=%%b
    SET _Year=%%c
    )
    ECHO Month %_Month%
    ECHO Day %_Day%
    ECHO Year %_Year%
    
  • 5

    使用REG保存/修改/恢复对bat文件最有用的值 . 这是Windows 7,对于其他版本,您可能需要不同的密钥名称 .

    reg save    "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg /y
    reg add     "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate  /d "yyyy-MM-dd" /f
    set file=%DATE%-%TIME: =0%
    reg restore "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg
    set file=%file::=-%
    set file=%file:.=-%
    set file
    
  • 54

    在这种情况下使用简单的标准编程方法:只需保存当前配置,将其重置为已知状态,提取信息然后恢复原始状态,而不是花费大量精力解析未知实体 . 仅使用标准Windows资源 .

    具体来说,日期和时间格式存储在[MS定义]“值”:“sTimeFormat”和“sShortDate”中的注册表项HKCU \ Control Panel \ International \下 . Reg是所有Windows版本附带的控制台注册表编辑器 . 修改HKCU密钥不需要提升权限

    Prompt $N:$D $T$G
    
    ::Save current config to a temporary (unique name) subkey, Exit if copy fails
    Set DateTime=
    Set ran=%Random%
    Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
    If ErrorLevel 1 GoTO :EOF
    
    ::Reset the date format to your desired output format (take effect immediately)
    ::Resetting the time format is useless as it only affect subsequent console windows
    ::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
    Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f
    
    ::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
    Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
    Set DateTime=%DateTime: =0%
    
    ::Restore the original config and delete the temp subkey, Exit if restore fails
    Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
    If ErrorLevel 1 GoTO :EOF
    Reg delete "HKCU\Control Panel\International-Temp%ran%" /f
    

    简单,直接,适用于所有地区 .

    由于我不明白的原因,重置"sShortDate"值会立即在控制台窗口中生效,但重置非常相似的"sTimeFormat"值在新的控制台窗口打开之前不会生效 . 但是,唯一可以改变的是分隔符 - 数字位置是固定的 . 同样,"HH"时间标记应该在前置零之前,但它不会 . 幸运的是,解决方法很简单 .

  • 0

    使用%,您将在时间遇到十六进制操作错误 Value 是7-9 . 要避免这种情况,请使用 DelayedExpansion 并使用!min:~1获取时间值!

    另一种方法,如果你有 PowerShell 则调用:

    for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)
    

相关问题