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

在Windows(Windows XP)批处理脚本中,我需要格式化当前的date和时间,以便稍后用于文件名等。

它类似于堆栈溢出问题如何在batch file中添加date ,但也是时间。

我到目前为止:

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 

我结束了这个脚本:

 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上,例如我需要设置月份=%date:〜3.2%,如下所示:否则00月份出现

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

以下是我如何生成日志文件名(基于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 ... 

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

 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可用,请检查你的batch file…)

您可以合理地问:为什么要使用batch file,如果您可以使用PowerShell来获取date/时间,但我认为一些显而易见的原因是:(a)您不是所有熟悉PowerShell的人都更喜欢做最(b)你正在更新一个旧的脚本,不想将整个东西移植到PS。

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

 SET LOGTIME=%TIME: =0% 

它用0代替空格,基本上是小时填零。

一些快速search后,我没有find它是否需要命令扩展(仍然与SETLOCAL DISABLEEXTENSIONS一起工作)。

如前所述,parsingdate和时间只有在您知道当前用户使用的格式(例如,MM / dd / yy或dd-MM-yyyy来命名两个)时才有用。 这可以被确定,但是当你做所有的压力和parsing的时候,你仍然会遇到一些意外格式的使用,而且需要更多的调整。

您也可以使用一些外部程序,它会以您的首选格式返回一个date段落,但是这样做有缺点,需要使用脚本/批次来分发实用程序。

还有一些批量的技巧,使用CMOS时钟的方式非常简单,但对于大多数人来说这太接近裸线了,也不一定是检索date/时间的首选位置。

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

 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 

我通常这样做,只要我需要一个date/时间string:

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

这是德国date/时间格式(dd.mm.yyyy hh:mm:ss)。 基本上我连接子string,最后用零replace所有的空格。

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

 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% 

至less它可能是鼓舞人心的。

你可以做得更容易:

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

回声%date时间%返回“

 2015-09-01_09-58-33 

第一行将date/时间转换为所需格式,第二行将所有空格replace为0(零)。

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

但是,您可以编写一个BATCH脚本来检查小时数是否小于10
用相应的不同的echostring填充。

你会在这个链接上find关于SET命令的一些信息 。


您也可以更改为其他编程方法来到这里。

在unix bash(在Windows上的Cygwin上可用)中,这很简单,

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

而且,它总是正确填充。

 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% 

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

 2009_07_28__08_36_01 

然后,您可以使用以下3行代码 ,它使用%date%和%time%:

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

注:字符/:被删除,字符. 空格被replace为下划线。

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

 echo %mytimestamp% Wed_08052015_124950_93 

要生成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%) 

我这样做了:

 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

 ::======================================================================== ::== 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
这使您只需格式化输出以符合您的意愿。

 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% 

创build一个名为“search_files.bat”的文件,并将下面的内容放入文件中。 然后双击它。 临时的%THH%variables已经到位,以适当地处理AM。 如果在时间的前两个数字中有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 

即时通讯真的很新的batch file,这是我的代码! (不知道为什么,但我不能把date/吨时间/吨结合起来,我不能使用%date%%时间%直接没有variables…)

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

有点从别人重用(问题是得到一个格式的时间作为文件名)

这个批处理脚本将完全按照OP的要求(在Windows XP SP3上testing)。

我之前也使用过“jph”描述的聪明的registry技巧,其中恕我直言是在任何新的或旧的Windows系统"yyyy_MM_dd"date格式化为"yyyy_MM_dd"的最简单的方法。 为了做到这一点,修改一个registry值是瞬时的,微不足道的; 它只会持续几毫秒,然后立即恢复。

双击此batch file进行即时演示,命令提示符窗口将popup并显示您的时间戳。 。 。 。 。

 @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 

我喜欢@洛杉矶之上的短版本,但对于其他语言设置,它可能会稍有不同。

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

 @ECHO OFF : Sets the proper date and time stamp with 24h time for log file naming convention ie 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; eg: the date-output of this post timestamp) PAUSE 

这是我的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% 

我试着接受的答案,它工作得很好。 不幸的是,美国时间格式似乎是H:MM:SS.CS,在上午10点之前在前面丢失的0导致parsing问题。 为了克服这个障碍,也允许parsing大部分世界时间格式,我想出了这个简单的例程,似乎工作得很好。

 :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 

这个例程的好处在于,您将时间string作为第一个参数,并将要包含时间(以厘秒为单位)的环境variables的名称作为第二个parameter passing。 例如:

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

(*克里斯*)

也许这样的事情:

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

对于在文件名中使用数字date的一个非常简单的解决scheme使用下面的代码:

 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 

用斜杠分割date命令的结果,然后你可以将每个标记移动到合适的variables中。

 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% 

使用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 

这个bat文件(保存为datetimestr.bat)会产生3次date时间string:(1)长date时间string,星期和星期几,(2)短date时间string,没有它们和(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(14年6月18日在21:02)和opello(8月25日在14时27分)的概念合并在一起。

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

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

具体而言,date和时间格式存储在[MS definition]“values”:“sForFormat”和“sShortDate”中的registry项HKCU \ Control Panel \ International \下。 Reg是所有Windows版本附带的控制台registry编辑器。 升级权限不需要修改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”值立即在控制台窗口中生效,但重置相似的“sForFormat”值不会生效,直到打开一个新的控制台窗口。 但是,唯一可以改变的是分隔符 – 数字位置是固定的。同样,“HH”时间标记应该是前导前导零,但是不是。 幸运的是,解决方法很简单。

使用%,当时间值为7-9时,将会遇到hex操作错误。 为了避免这种情况,请使用DelayedExpansion并使用!min: 〜1获取时间值!

另外一种方法,如果你有PowerShell就是这样调用的:

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