在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

当前回答

for /f "tokens=1-4 delims=/ " %%I in ("%DATE%") do set curdate=%%K_%%J_%%I
for /f "tokens=1-4 delims=:," %%I in ("%TIME: =0%") do set curtime=%%I_%%J_%%K
echo %curdate%__%curtime%

如果您的系统使用另一个替换delims符号(用于切片到%%I,%%J…) 如果您的系统使用另一个D/M/Y订单,也可以编辑curdate

其他回答

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

具体来说,日期和时间格式存储在注册表项下 HKCU\Control Panel\International\ [MS定义]"values": " timeformat "及"sShortDate"。 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”时间标记应该在前导零之前,但它没有。 幸运的是,变通方法很简单。

如果你不需要这个格式:

2009_07_28__08_36_01

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

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

注意:字符/和:被删除,字符。空格被下划线取代。

示例输出(摄于8/5/15星期三下午12:49,时间为50秒93毫秒):

echo %mytimestamp%
Wed_08052015_124950_93

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

Windows中SET命令支持的offset:length格式将不允许您填充您似乎感兴趣的0。

但是,您可以编写一个BATCH脚本来检查小时是否小于10和 相应地用不同的回声字符串进行填充。

您将在此链接中找到关于SET命令的一些信息。


您还可以更改其他编程方法以达到此目的。

在unix bash (Windows上的Cygwin可用)中,只需说,

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

它总是正确地填充。

创建一个名为“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