批处理文件中不知道语言环境的 %DATE% 和 %TIME%?

Pek*_*kka 23 windows windows-server-2008 localization batch

%DATE%%TIME%环境变量提供命令行和批处理文件内的当前日期和时间在Windows机器上。

可悲的是,这些值是本地化的!这意味着,比如说,在德国机器上,你会得到

26.1.2011
Run Code Online (Sandbox Code Playgroud)

代替

2011-26-01
Run Code Online (Sandbox Code Playgroud)

如果你想在文件名中使用这个变量,这会搞砸排序。

有没有什么简单的方法可以YYYY-MM-DD在 Windows 批处理文件中获取语​​言环境未知的日期字符串?

目前,我正在使用这种相当笨拙的解决方法:

for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%
Run Code Online (Sandbox Code Playgroud)

但现在这是德语语言环境中具体-显然,一个完全独立的解决办法是漂亮。

有问题的操作系统是 Server 2008。如果可能的话,我宁愿不使用第三方工具。

Joe*_*oey 25

有一些尝试(Rob van der Woude有一些尝试),但没有任何地方真正适用于所有语言环境。但是,您可以通过以下方式以易于解析的格式获取当前时间

wmic os get LocalDateTime
Run Code Online (Sandbox Code Playgroud)

以下内容至少可以让您获得 UTC:

@echo off
rem Get the time from WMI - at least that's a format we can work with
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x
echo.%X%

rem dissect into parts
set DATE.YEAR=%X:~0,4%
set DATE.MONTH=%X:~4,2%
set DATE.DAY=%X:~6,2%
set DATE.HOUR=%X:~8,2%
set DATE.MINUTE=%X:~10,2%
set DATE.SECOND=%X:~12,2%
set DATE.FRACTIONS=%X:~15,6%
set DATE.OFFSET=%X:~21,4%

echo %DATE.YEAR%-%DATE.MONTH%-%DATE.DAY% %DATE.HOUR%:%DATE.MINUTE%:%DATE.SECOND%.%DATE.FRACTIONS%
Run Code Online (Sandbox Code Playgroud)

但是,您可能需要考虑时区偏移量(除非它用于日志文件,否则我将始终使用 UTC)但这一点计算都做不到 :-)

  • 为了记录:`for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%x` 稍微好一点。还有一个[更紧凑的版本在这里](http://stackoverflow.com/a/203116/),即在[评论](http://stackoverflow.com/questions/203090/how-to-get -current-datetime-on-windows-command-line-in-a-suitable-format-for-us#comment14652563_203116)。 (2认同)

小智 14

这是我一直在使用的两行代码,无论 Windows 版本或本地时间设置如何,它似乎都可以工作:

FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%
Run Code Online (Sandbox Code Playgroud)

这将以以下 ISO 标准格式设置一个名为 %CUR_DATE% 的变量:

yyyy-mm-dd
Run Code Online (Sandbox Code Playgroud)

我试着用&& 把它做成一行,但似乎不行,所以我求助于两行版本。希望这可以帮助。