我的lua文件中的示例:
local start = os.time()
while(true) do
print(os.time() - start)
end
在c ++中,我收到了输出:
1
1
1
...(1 seconds passed)
2
2
2
在java(使用Luaj )中,我得到了:
1
...(terminate in eclipse as fast as my finger can)
659
659
659
659
fyi,我在windows上试试这个
答案 0 :(得分:10)
是的,luaj中有一个错误。
当你调用os.time()时,实现只返回System.currentTimeMillis()
。它应该真正返回(long)(System.currentTimeMillis()/1000.)
值得指出的是,luaj中的os.date和os.time处理几乎完全没有了。我建议您假设它们尚未实施。
答案 1 :(得分:2)
关于os.time()的Lua手册:
返回的值是一个数字,其含义取决于您的系统。在POSIX,Windows和其他一些系统中,此数字计算自某个给定开始时间以来的秒数(" epoch")。在其他系统中,未指定含义,并且time返回的数字仅可用作os.date和os.difftime的参数。
因此,任何Lua实现都可以自由地改变os.time()
值的含义。
答案 2 :(得分:2)
看起来你已经确认这是LuaJ中的一个错误;至于解决方法,您可以用自己的版本替换os.time():
if (runningunderluaj) then
local ostime = os.time
os.time = function(...) return ostime(...)/1000 end
end
其中runningunderluaj
可以检查仅在luaj下设置的某个全局变量。如果这不可用,您可以通过比较调整时间差异的os.clock
和os.time
的调用结果来提出您自己的检查:
local s = os.clock()
local t = os.time()
while true do
if os.clock()-s > 0.1 then break end
end
-- (at least) 100ms has passed
local runningunderluaj = os.time() - t > 1
注意:os.clock()
也可能被“破坏”。我无权访问luaj来测试这个......
答案 3 :(得分:1)
在luaj-3.0-beta2中,这已被修复为以秒为单位的返回时间。
这是luaj的所有版本中的错误,包括luaj-3.0-beta1。