Luaj os.time()返回毫秒数。

在 Luaj 中,os.time() 函数返回毫秒级别的时间,但根据 Lua 文档,它应该返回秒级别的时间。

  1. 这是 Luaj 的 bug 吗?
  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 秒钟过去了)
2
2
2

在 Java(使用 Luaj)中,我得到:

1
...(如闪电般地在 Eclipse 中终止)
659
659
659
659

说明一下,我在 Windows 上尝试了这个问题。

点赞
用户1847592
用户1847592

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

返回的值是一个数字,其含义取决于您的系统。在 POSIX,Windows 和一些其他系统中,这个数字计算的是从某个给定的开始时间("epoch")以来的秒数。在其他某些系统中,这个含义并没有被指定,time 返回的数字只能作为 os.date 和 os.difftime 的参数使用。

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

2013-04-24 05:28:30
用户2279620
用户2279620

就 luaj 存在一个错误

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

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

2013-04-24 11:16:23
用户1442917
用户1442917

看起来你已经确认了这是 LuaJ 中的 bug;至于解决方法,你可以将 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
-- (至少)经过了 100ms
local runningunderluaj = os.time() - t > 1

注意:os.clock() 也可能是 “损坏”的。我没有访问 Luaj 进行测试...

2013-04-24 16:31:40
用户2556943
用户2556943

在 luaj-3.0-beta2 版本中,这个问题已经被修复以返回秒为单位的时间。

这是在luaj-3.0-beta1及其之前的所有版本中存在的一个错误。

2014-01-07 16:28:34