批处理:UNIX时间的时间戳

bea*_*605 12 batch-file unix-timestamp

据我所知,Batch没有给出UNIX时间的命令.我能找到的最接近的是%time%,它只显示时间戳.

批处理中是否有命令或命令集可以获得UNIX时间?

Eit*_*n T 18

Richie Lawrence的批处理库,它有所有那些漂亮的方便脚本.你需要的是DateToSec(它使用GetDateGetTime).

这是一个简化的脚本,它使用了一点WMI:

@echo off
setlocal
call :GetUnixTime UNIX_TIME
echo %UNIX_TIME% seconds have elapsed since 1970-01-01 00:00:00
goto :EOF

:GetUnixTime
setlocal enableextensions
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do (
    set %%x)
set /a z=(14-100%Month%%%100)/12, y=10000%Year%%%10000-z
set /a ut=y*365+y/4-y/100+y/400+(153*(100%Month%%%100+12*z-3)+2)/5+Day-719469
set /a ut=ut*86400+100%Hour%%%100*3600+100%Minute%%%100*60+100%Second%%%100
endlocal & set "%1=%ut%" & goto :EOF
Run Code Online (Sandbox Code Playgroud)

结果将返回到传递给的第一个参数GetUnixTime,即%UNIX_TIME%.
例如:

1341791426 seconds have elapsed since 1970-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 这是一个很好的答案,但我似乎在代码中发现了一个错误.在今年的前两个月,结果是未来两年.你有'4800 + z`的地方,我觉得你需要`4800-z`.请参阅Richie Lawrence的原始DateToSecs代码.如果您有时间,请验证我的修复(并编辑您的帖子). (3认同)
  • 好.谢谢.我在我的副本中做了另一个改动.这不是一个真正的错误,但我想我会与你分享.我把这个代码分开试图完全理解它.我想你如果把`-2472633`改为`-719469`就不需要加4800.它只是支持这里不需要的调整.所以你结束了以'10000%年%%% 10000-z`和'Day-719469`结尾的两行.没有太大的区别,但现在更容易解释719469是什么,它是1970年以来用于调整时代的天数. (3认同)
  • 哦,谢谢,这很棒.我和Richie Lawrence交换了电子邮件.我很惊讶他回复我的第一封电子邮件,询问他4800调整的速度.我给他写了一个相当完整的理由去除它.(显然)修正是为了支持朱利安日,它有一个公元前4713年1月1日的时代(预言朱利安历).但我们的最终计算是从1970年1月1日开始的秒数,Windows Batch使用32位有符号整数,将最早的日期限制在1901/12/13. (2认同)

mgu*_*ven 5

创建一个名为"getUtime.bat"的.bat文件

@echo off
echo WScript.Echo(new Date().getTime()); > %temp%\time.js
cscript //nologo %temp%\time.js
del %temp%\time.js
Run Code Online (Sandbox Code Playgroud)

并像这样打电话

"C:\>getUTime"
1430894237616
Run Code Online (Sandbox Code Playgroud)