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

247

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

这与Stack Overflow的问题 如何在批处理文件中追加日期类似,但是还包括时间。

到目前为止,我有:

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

无论区域设置如何,在批处理文件中拆分%date% - phuclv
你可以将datetimef变量中的空格替换为0。例如:SET datetimef=%datetimef: =0% - SebaGra
37个回答

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

7

我对批处理文件非常陌生,以下是我的代码!!(我不确定为什么不能将date /ttime /t组合在一起,也不能直接使用%date%%time%而不需要变量...)

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

这个是从其他地方复用的(问题是获取格式化后的日期时间并将其用作文件名)。


7
这个批处理脚本会按照 O.P. 的要求执行(在 Windows XP SP3 上测试通过)。
我还使用了之前由“jph”描述的聪明的注册表技巧,这是在任何新旧的 Windows 系统上获得 100% 一致的日期格式为“yyyy_MM_dd”的最简单方法。对一个注册表值进行更改是瞬时、临时和微不足道的;它只会持续几毫秒,然后立即恢复原样。
双击此批处理文件即可进行快速演示,命令提示窗口将弹出并显示您的时间戳......
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- 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 [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (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
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT

也适用于Windows 2019。我会保留你的解决方案,我很喜欢它 :) - user225479
问题:我刚刚发现,在午夜之后,输出中的末尾“0”会被删除。有任何想法为什么会这样吗?使用您的脚本输出我的时间戳是:2019_09_16__0_58_07,而不是..00_58_07。但在一点钟之后,它按预期工作(并且将输出:..01_01_56)。 - user225479
我在ELSE语句中添加了IF %HOUR%==0 (SET HOUR=00)。希望这样可以解决问题 :) - user225479
1
感谢用户@user225479的反馈。我已经修复了代码。所有可能的HOUR变量排列组合现在都可以正确地转换为24小时格式。我还修改了布局,使其更易于阅读。 - derty2
将“set hour=0%hour%”然后“set hour=%hour:~-2%”设置为小时,比所有那些“if”语句简单得多!(子字符串-从结尾开始往回数第二个字符。) - JGFMK

7
我是这样做的:
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


它运行在英语服务器上(操作系统名称:Microsoft(R) Windows(R) Server 2003 Standard x64 Edition,操作系统版本:5.2.3790 Service Pack 2 Build 3790)。 - Ice
1
并且在德国服务器上进行了测试(操作系统名称:Microsoft® Windows Server® 2008 Enterprise,操作系统版本:6.0.6002 Service Pack 2 Build 6002)。 - Ice
1
即使是这个也可以:(操作系统名称:Microsoft Windows Server 2012 Standard,操作系统版本:6.2.9200不适用Build 9200) - Ice

7
在Windows中,SET命令支持offset:length格式化,但是它不允许你像你感兴趣的那样填充0
但是,你可以编写一个批处理脚本来检查小时数是否小于10,并使用不同的echo字符串进行填充。
你可以在这个链接上找到一些关于SET命令的信息:http://www.computerhope.com/sethlp.htm
你也可以改用其他编程方法来实现这个目标。
在Unix bash中(在Windows上可通过Cygwin获得),只需简单地输入以下命令即可:
date +%Y_%m_%d__%H_%M_%S

而且,它总是正确地填充。


使用Bash是作弊! :-) - mivk

5

还有一种简单的方法:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)

4

这个批处理文件(另存为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)的概念。
你可以写得更简短,但这个长版本使阅读和理解代码变得容易。

3

我喜欢@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

3
为了生成一个 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%)

它是否假定了特定的区域设置? - Peter Mortensen
2
根据 http://ss64.com/nt/syntax-variables.html ,%TIME%%DATE% 变量使用 TIMEDATE 命令的相同格式。但在我的系统中,这些变量与我的区域设置不匹配。 - sourcenouveau

2

您可以使用这些选项来优化您的 IT 系统:

Parameters:
%date:~4,2% -- month
%date:~7,2% -- days
%date:~10,4% -- years

%time:~1,1% -- hours
%time:~3,2% -- minutes
%time:~6,2% -- seconds
%time:~9,2% -- mili-seconds

%date:~4,2%%date:~7,2%%date:~10,4% : MMDDYYYY
%date:~7,2%%date:~4,2%%date:~10,4% : DDMMYYYY
%date:~10,4%%date:~4,2%%date:~7,2% : YYYYMMDD

2
这个答案只在 Windows 中设置了特定日期格式时才有效。因此,在全球大多数 Windows 系统上都不起作用。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接