如何使用Windows批处理文件获取UTC时间

5

我一直在尝试找到一种方法,让Windows批处理文件在运行时显示当前的UTC时间,也就是获取自1970年以来启动后经过的毫秒数。

有谁知道如何做到这一点吗?


8
1970年与协调世界时(UTC)无关。1970年1月1日是Unix时间纪元,而Unix时间使用UTC,但除此之外,这两者完全没有关联。 - Joey
3个回答

13

使用WMI:

for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
这将设置变量DayDayofWeekHourMinuteMonthQuarterSecondWeekInMonthYear,你可以在之后使用它们。
不过,如果你想从Windows获得Unix纪元时间的话就不容易了。如果你有PowerShell,可以使用以下命令:
[long]((date).touniversaltime()-[datetime]'1970-01-01').totalmilliseconds

你可以通过批处理文件调用该函数:

powershell "..."

但在这种情况下,你随时可以用真正的编程语言来编写批处理文件。


WMIC已经过时。 - Nicolas VERHELST

1
替代方案:
REM get UTC times:
for /f %%a in ('wmic Path Win32_UTCTime get Year^,Month^,Day^,Hour^,Minute^,Second /Format:List ^| findstr "="') do (set %%a)
Set Second=0%Second%
Set Second=%Second:~-2%
Set Minute=0%Minute%
Set Minute=%Minute:~-2%
Set Hour=0%Hour%
Set Hour=%Hour:~-2%
Set Day=0%Day%
Set Day=%Day:~-2%
Set Month=0%Month%
Set Month=%Month:~-2%
set UTCTIME=%Hour%:%Minute%:%Second%
set UTCDATE=%Year%%Month%%Day%

0
wmic TIMEZONE get * /value

样例输出

Bias=-480
Caption=(UTC-08:00) Pacific Time (US & Canada)
DaylightBias=-60
DaylightDay=2
DaylightDayOfWeek=0
DaylightHour=2
DaylightMillisecond=0
DaylightMinute=0
DaylightMonth=3
DaylightName=Pacific Daylight Time
DaylightSecond=0
DaylightYear=0
Description=(UTC-08:00) Pacific Time (US & Canada)
SettingID=
StandardBias=0
StandardDay=1
StandardDayOfWeek=0
StandardHour=2
StandardMillisecond=0
StandardMinute=0
StandardMonth=11
StandardName=Pacific Standard Time
StandardSecond=0
StandardYear=0

在这个例子中,我想要UTC信息,这样当我输出到日志时,我可以插入UTC信息:
wmic TIMEZONE get * /value | FIND /I "Description"

现在我想解析这个字符串:
(注意在 .cmd 脚本/程序中,使用 %%P,%P 仅用于控制台)
FOR /F "tokens=2 delims==" %P IN ('wmic TIMEZONE get * /value ^| FIND /I "Description"') DO Echo %P> var_UTC.txt

现在我想要设置一个包含UTC的变量。

SET /P $SYSTEM_UTC= < var_UTC.txt

现在我想在写入日志时使用变量

(注意将其放在变量中可以控制文本)

echo 2020-12-15 [INFO] %$SYSTEM_UTC% > program.log

你可以查看我的Github代码库,了解一些复杂的程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接