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

lau*_*rie 178 windows formatting datetime batch-file

在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%
Run Code Online (Sandbox Code Playgroud)

这使:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01
Run Code Online (Sandbox Code Playgroud)

有没有办法允许%TIME%的单个数字小时,所以我可以得到以下内容?

2009_07_28__08_36_01
Run Code Online (Sandbox Code Playgroud)

lau*_*rie 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%
Run Code Online (Sandbox Code Playgroud)

::在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%
Run Code Online (Sandbox Code Playgroud)

  • 请注意将来谷歌的人(像我一样):这是依赖于语言环境的,因此可能需要调整才能在非英语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
Run Code Online (Sandbox Code Playgroud)

  • %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认同)

nig*_*der 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
...
Run Code Online (Sandbox Code Playgroud)

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

And*_*eas 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%
Run Code Online (Sandbox Code Playgroud)

这是德国日期/时间格式(dd.mm.yyyy hh:mm:ss).基本上我连接子串并最终用零替换所有空格.

简短解释子串如何工作:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
Run Code Online (Sandbox Code Playgroud)

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

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,当您只需要一个干净的时间戳(没有空格或其他字符)时,这是最优雅的解决方案 (6认同)
  • 最佳答案,因为它解释了如何打印变量,而不是强制使用一些对很多人来说可能不同的子字符串。我总是先运行 echo %date%_%time% 来查看变量单独为我打印什么,然后决定我想要保留哪些子字符串。 (2认同)

G. *_*ard 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%"
Run Code Online (Sandbox Code Playgroud)

当然,现在总是安装PowerShell,但是在Windows XP上,如果您的批处理脚本在知道PS可用的已知环境中使用(或者如果PowerShell可用,则检查批处理文件),您可能只想使用此技术. ...)

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


ope*_*llo 30

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

SET LOGTIME=%TIME: =0%
Run Code Online (Sandbox Code Playgroud)

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

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


小智 20

如前所述,解析日期和时间仅在您知道当前用户使用的格式时才有用(例如,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
Run Code Online (Sandbox Code Playgroud)

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

ufu*_*gun 9

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

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%
Run Code Online (Sandbox Code Playgroud)

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


Jes*_*sse 9

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

2009_07_28__08_36_01
Run Code Online (Sandbox Code Playgroud)

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

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%
Run Code Online (Sandbox Code Playgroud)

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

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

echo %mytimestamp%
Wed_08052015_124950_93
Run Code Online (Sandbox Code Playgroud)


小智 7

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%
Run Code Online (Sandbox Code Playgroud)


Kel*_*lly 7

我对批处理文件真的很陌生,这是我的代码!!(我不知道为什么,但我不能将date /ttime /t组合在一起,我不能在没有变量的情况下直接使用%date%%time% ......)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT
Run Code Online (Sandbox Code Playgroud)

它是从其他人那里重用的(问题是获取格式化的时间日期以用作文件名)。


nik*_*nik 6

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

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

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


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

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

date +%Y_%m_%d__%H_%M_%S
Run Code Online (Sandbox Code Playgroud)

而且,它总是正确填充.


Ice*_*Ice 6

我是这样做的:

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%
Run Code Online (Sandbox Code Playgroud)

LogFile201310170928.log


der*_*ty2 5

This batch script will do exactly what the O.P. wants (tested on Windows XP SP3).

I also used that clever registry trick described by "jph" previously which IMHO is the simplest way of getting 100% consistent formatting of the date to "yyyy_MM_dd" on any Windows system new or old. The change to one Registry value for doing this is instantaneous temporary and trivial; it only lasts a few milliseconds before it is immediately reverted back.

Double-click this batch file for an instant demo, Command Prompt window will pop up and display your timestamp . . . . .

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 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
Run Code Online (Sandbox Code Playgroud)


Kee*_*ees 5

::========================================================================  
::== 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%  
Run Code Online (Sandbox Code Playgroud)

无论时区如何,第一行始终以这种格式输出:
20150515150941.077000+120
这使您只需格式化输出以满足您的愿望。


小智 5

还有另一种简单的方法:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
Run Code Online (Sandbox Code Playgroud)