%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 有基本的了解)。