当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Windows批处理脚本中格式化日期和时间》经验,为你挑选了12个好方法。

在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

laurie.. 141

我最终得到了这个脚本:

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上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现

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%

请注意将来谷歌的人(像我一样):这是依赖于语言环境的,因此可能需要调整才能在非英语Windows上运行! (45认同)

仅供参考,在Windows Server 2003和Windows 7上,此脚本为我提供了"201200Mo_085806"(正确的年份和时间). (11认同)

所有这一切都可以使用普通的字符串替换只需2行:http://stackoverflow.com/a/23558738/1879699 (5认同)


小智.. 70

@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

%date%将为不同的语言环境提供不同的字符串. (7认同)

以下是它在Windows 7中提供的俄语语言环境.当前时间是2013-05-03T02:22:51,但脚本打印:"2013-5.-01_02_22_51" (3认同)

在Windows Server 2003和Windows 7上,这给了我正确的字符串.比我过去构建的要优雅得多,谢谢! (2认同)

将20146.0._173502返回给我(捷克语locale) (2认同)

win7 64bit终极,错误时间:20140.01_131612,必须(2014.10.26_131612) (2认同)


nightcoder.. 63

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

有关批量中与区域设置无关的时间戳生成的问题,请参阅SO的最佳答案. (5认同)

真棒!应该有办法将此标记为解决方案 (2认同)

这似乎是最好的解决方案,谢谢 (2认同)


Andreas.. 42

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

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).基本上我连接子串并最终用零替换所有空格.

简短解释子串如何工作:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

因此,从"29.03.2018"之类的日期开始,只需使用:

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

到目前为止,当您只需要一个干净的时间戳(没有空格或其他字符)时,这是最优雅的解决方案 (6认同)


G. Lombard.. 38

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

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可用,则检查批处理文件),您可能只想使用此技术. ...)

您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS.



1> laurie..:

我最终得到了这个脚本:

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上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现

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%


请注意将来谷歌的人(像我一样):这是依赖于语言环境的,因此可能需要调整才能在非英语Windows上运行!
仅供参考,在Windows Server 2003和Windows 7上,此脚本为我提供了"201200Mo_085806"(正确的年份和时间).
所有这一切都可以使用普通的字符串替换只需2行:http://stackoverflow.com/a/23558738/1879699

2> 小智..:
@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


%date%将为不同的语言环境提供不同的字符串.
以下是它在Windows 7中提供的俄语语言环境.当前时间是2013-05-03T02:22:51,但脚本打印:"2013-5.-01_02_22_51"
在Windows Server 2003和Windows 7上,这给了我正确的字符串.比我过去构建的要优雅得多,谢谢!
将20146.0._173502返回给我(捷克语locale)
win7 64bit终极,错误时间:20140.01_131612,必须(2014.10.26_131612)

3> nightcoder..:

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


有关批量中与区域设置无关的时间戳生成的问题,请参阅SO的最佳答案.
真棒!应该有办法将此标记为解决方案
这似乎是最好的解决方案,谢谢

4> Andreas..:

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

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).基本上我连接子串并最终用零替换所有空格.

简短解释子串如何工作:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

因此,从"29.03.2018"之类的日期开始,只需使用:

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


到目前为止,当您只需要一个干净的时间戳(没有空格或其他字符)时,这是最优雅的解决方案

5> G. Lombard..:

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

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可用,则检查批处理文件),您可能只想使用此技术. ...)

您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS.



6> opello..:

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

SET LOGTIME=%TIME: =0%

它用0替换空格,基本上是零填充小时.

经过一些快速搜索后,我没有发现它是否需要命令扩展(仍然使用SETLOCAL DISABLEEXTENSIONS).



7> 小智..:

如前所述,解析日期和时间仅在您知道当前用户使用的格式时才有用(例如,MM/dd/yy或dd-MM-yyyy仅命名为2).这可以确定,但是当你进行所有压力和解析时,你仍然会遇到一些使用了意外格式的情况,并且需要进行更多调整.

您还可以使用一些外部程序,它将以您的首选格式返回日期slug,但这样做的缺点是需要使用您的脚本/批处理分发实用程序.

还有一些以非常原始的方式使用CMOS时钟的批处理技巧,但对于大多数人来说,它太接近于裸线,并且也不总是检索日期/时间的首选位置.

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

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


这是一个可怕的解决方案.如果失败,则永久更改全局设置.它还介绍了其他应用程序的竞争条件.
正是我在寻找的东西.适用于每个区域设置的东西.谢谢!

8> ufukgun..:

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

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%

至少它可能是鼓舞人心的.



9> Jesse..:

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

2009_07_28__08_36_01

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

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

注:字符/:被删除,字符.和空格替换为下划线.

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

echo %mytimestamp%
Wed_08052015_124950_93



10> 小智..:
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%



11> nik..:

Windows中offset:lengthSET命令支持的格式将不允许您填充0您似乎感兴趣的内容.

但是,您可以编写BATCH脚本以检查小于的小时数10
使用不同的echo字符串进行相应的填充.

您可以在此链接上SET找到有关该命令的一些信息.


你也可以改用其他编程方法来到这里.

unix bash(Windows上的Cygwin提供)非常简单,只是说,

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

而且,它总是正确填充.



12> Ice..:

我是这样做的:

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有