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

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

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

遗憾的是,这些值是区域感知的!也就是说,在德国的机器上,你会得到

26.1.2011

代替

2011-26-01

如果您想在文件名中使用此变量,这会搞乱排序。

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

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

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

但现在这是德国地区特有的——显然,一个完全独立的解决方案是很多更好。

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

答案1

有几次尝试(罗布·范德沃德有一些),但没有一个真正适用于所有语言环境。不过,你可以通过以下方式以易于解析的格式获取当前时间:

wmic os get LocalDateTime

下面的操作至少可以让你获得 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%

但是,您可能需要考虑时区偏移(除非是日志文件,否则我总是使用 UTC),但这并不是一点计算无法做到的 :-)

答案2

这是我一直在使用的两行代码,无论 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%

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

yyyy-mm-dd

我尝试使用 && 将其变成一行,但似乎不行,所以我求助于两行版本。希望这能有所帮助。

答案3

我使用这个技巧来获取 UTC。

for /f "tokens=*" %%i in ('tzutil /g') do set CTZ=%%i
tzutil /s UTC
set UTC=
for /f  "skip=1 delims=" %%i in ('WMIC OS GET LocalDateTime') do if not defined UTC set UTC=%%i
tzutil /s "%CTZ%"
set UTC=%UTC:~0,4%-%UTC:~4,2%-%UTC:~6,3%T%UTC:~8,13%
echo %UTC%

但是,这样做确实有副作用,即暂时将整个系统更改为 UTC。这在个人工作站上可能没问题,但不确定这会对大型生产服务器产生什么影响,因为无论如何,大型生产服务器可能都应该设置为 UTC。

答案4

以下是我对这个问题的解决方案:

@echo off

set curtime=
for /f "tokens=*" %%x in ('powershell -NoLogo -NonInteractive -OutputFormat Text -Command "[DateTime]::Now.ToString(\"yyyy-MM-dd HH:mm:ss\")"') do set curtime=%%x
echo %curtime%

当然和UTC时间一样:

set curtime=
for /f "tokens=*" %%x in ('powershell -NoLogo -NonInteractive -OutputFormat Text -Command "[DateTime]::UtcNow.ToString(\"yyyy-MM-dd HH:mm:ssK\")"') do set curtime=%%x
echo %curtime%

您可以随意调整格式,输出是稳定的,与 CurrentLocale 的 Windows 无关(这里需要对 Powershell 和 .Net 有基本的了解)。

相关内容