3

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

  1. 这是Luaj中的错误吗?
  2. 您能否建议一种适用于 Luaj(for 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 上试试这个

4

4 回答 4

10

是的,luaj 中有一个错误。

System.currentTimeMillis()当您调用 os.time() 时,该实现只会返回。它真的应该返回类似的东西(long)(System.currentTimeMillis()/1000.)

还值得指出的是,luaj 中的 os.date 和 os.time 处理几乎完全缺失。我建议您假设它们尚未实施。

于 2013-04-24T11:16:23.370 回答
2

关于 os.time() 的 Lua 手册:

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

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

于 2013-04-24T05:28:30.453 回答
2

看来您已经确认这是 LuaJ 中的错误;至于解决方法,您可以将 os.time() 替换为您自己的版本:

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

whererunningunderluaj可以检查一些仅在 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 来测试这个......

于 2013-04-24T16:31:40.463 回答
1

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

这是所有版本的 luaj 中的错误,包括 luaj-3.0-beta1。

于 2014-01-07T16:28:34.363 回答