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

这类似于堆栈溢出问题如何在批处理文件中添加日期,但也包含时间。

到目前为止,我有这个:

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

当前回答

我是这样做的:

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

其他回答

使用%,当时间值为7-9时,您将遇到十六进制操作错误。为了避免这种情况,请使用delayeexpand并使用!min:~1!

如果你有PowerShell,另一个方法是调用它:

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

还有另一种简单的方法:

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

设置xtime = % % 如果“%xtime:~0,1%”==“”则设置xtime=0%xtime:~1,7% 设置isodate = %日期:~ -4% %日期:~ 3,2% %日期:~ 0,2% _ % xtime: ~ 0, 2% % xtime: ~ 3, 2% %时间:~ 6 2%

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

我尝试了公认的答案,效果很好。不幸的是,美国时间格式似乎是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%

克里斯(* *)