在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

当前回答

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

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)。基本上,我将子字符串连接起来,最后将所有空格替换为零。

结果字符串的格式为:yyyy_mm_dd__hh_mm_ss


子字符串如何工作的简短解释:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

因此,要想从“29.03.2018”这样的日期中得到年份,可以使用:

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

其他回答

我是这样做的:

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

为了在文件名中使用数字日期的一个非常简单的解决方案,请使用以下代码:

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

创建一个名为“search_files.bat”的文件,并将下面的内容放入该文件中。然后双击它。临时的%THH%变量被放置在适当的位置来处理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

还有另一种简单的方法:

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

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

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

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