2013-04-24 374 views
3

Luaj中的os.time()以毫秒为单位返回时间,但根据lua文档,它应该以秒为单位返回时间。Luaj os.time()返回毫秒

  1. 这是Luaj中的错误吗?
  2. 你能提出一个可以和Luaj(用于java)和真正的Lua(c/C++)一起工作的解决方法吗? 。因为我必须使用两个应用程序相同的LUA源(不能简单地用1000除以它,因为它们都具有返回不同的时间尺度)

例如在我的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 

仅供参考,我尝试在Windows操作系统上

+0

os.time()返回以秒为单位的时间。您可能会将*单位*与*精度*混淆。 '12.423'是以秒为单位的时间,精确到毫秒。 – 2013-04-24 01:26:58

+0

os.time()**应该**以秒为单位返回时间。但在** Luaj **中,它会以毫秒为单位返回(我认为,至少当我将其更改为1000时,感觉就像是第二次) – bysreg 2013-04-24 01:29:51

+1

您能举一个例子吗?我认为它会在几秒钟内返回时间,但精度达到毫秒级,并且您看到精度并与单位混淆。 – 2013-04-24 01:37:54

回答

2

约os.time的Lua手动():

返回的值是一个数字,其含义取决于你的系统。在POSIX,Windows和其他一些系统中,这个数字计算自某些给定开始时间(“时代”)以来的秒数。在其他系统中,没有指定含义,并且按时间返回的数字只能用作os.date和os.difftime的参数。

因此,任何Lua实现都可以自由更改os.time()值的含义。

+0

以上的问题中添加了代码示例“...在POSIX,** Windows **和其他一些系统中,......统计**秒数**”,对不起,我应该提到我的系统是什么。我使用窗户。所以它应该返回秒数的权利? – bysreg 2013-04-24 05:44:42

+0

以及您对解决方法有何建议? – bysreg 2013-04-24 05:45:20

+1

@bysreg - 有关POSIX,Windows的文字仅限于香草Lua。 Luaj不适用于Windows,它适用于Java。 ;-) – 2013-04-24 05:52:40

10

是的,luaj有一个错误。

当您调用os.time()时,实现仅返回System.currentTimeMillis()。它应该真的返回像(long)(System.currentTimeMillis()/1000.)

还值得指出的是,luaj中的os.date和os.time处理几乎完全没有。我建议你假设他们还没有实现。

+0

在搜索代码后检查你的语句,我证实luaj实现使用System.currentTimeMillis()for os.time()的实现(你可以在OsLib.java第308行中看到它) – bysreg 2013-04-24 16:38:13

2

看起来好像您已经确认它是LuaJ中的一个错误;作为变通方法,您可以用自己的版本替换os.time():

if (runningunderluaj) then 
    local ostime = os.time 
    os.time = function(...) return ostime(...)/1000 end 
end 

其中runningunderluaj可以检查是只有在luaj设置一些全局变量。如果这是不可用的,你或许可以拿出你自己的支票通过比较调用os.clockos.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来测试这...

+0

'os.clock()'返回程序使用的CPU时间**数量的近似值。 – hjpotter92 2013-04-24 17:00:05

+0

@ hjpotter92,正确,但它具有ms精度,因此计算delta应该没问题。 – 2013-04-24 21:41:07

1

在luaj-3.0-beta2中,这已被固定为以秒为单位的返回时间。

这是luaj到luaj-3.0-beta1之前的所有版本中的一个bug。