Lua - 当前时间的毫秒数

有没有一种通用方法来获得当前时间,包括毫秒?

os.time(),但它只提供完整的秒数。

原文链接 https://stackoverflow.com/questions/463101

点赞
stackoverflow用户19252
stackoverflow用户19252

在标准的C lua中不行。除非你愿意修改lua解释器,让os.time使用你想要的精度,否则你只能接受秒。然而,如果你写的代码是给其他人在他们自己的环境中运行而不是像网络应用一样完全掌控环境,那可能是无法接受的。

编辑:另一个选择是用C编写自己的小型DLL,扩展lua的一个新函数,可以给你想要的值,并要求将该dll与你的代码一起分发给使用它的人。

2009-01-20 21:09:10
stackoverflow用户33252
stackoverflow用户33252

Kevlar 是对的。

一个替代自定义 DLL 的选择是 Lua Alien

2009-01-20 21:15:30
stackoverflow用户58008
stackoverflow用户58008

我使用 LuaSocket 来获得更精确的时间。

require "socket"
print("Milliseconds: " .. socket.gettime()*1000)

当然,这样做会增加依赖,但在个人使用中(例如在基准测试脚本中),效果很好。

2009-01-22 20:07:18
stackoverflow用户78243
stackoverflow用户78243

你可以使用 C 函数 gettimeofday:

http://www.opengroup.org/onlinepubs/000095399/functions/gettimeofday.html

这里有一个名为 ul_time 的 C 库,其中的函数 sec_usec 存在于 'time' 全局表中,并返回秒数和微秒数。将 DLL 文件复制到 Lua 文件夹中,然后使用 require 'ul_time' 打开它。

http://depositfiles.com/files/3g2fx7dij

2009-03-15 14:01:34
stackoverflow用户136303
stackoverflow用户136303

如果您想要进行基准测试,可以使用文档中所示的 os.clock:

local x = os.clock()
local s = 0
for i=1,100000 do s = s + i end
print(string.format("elapsed time: %.2f\n", os.clock() - x))
2010-03-19 16:46:49
stackoverflow用户2069277
stackoverflow用户2069277

如果你正在使用nginx/openresty的lua,你可以使用ngx.now(),它会返回一个带有毫秒精度的浮点数。

2015-06-18 11:19:03
stackoverflow用户1987373
stackoverflow用户1987373

在 openresty 中,有一个函数 ngx.req.start_time

从文档中可以知道:

返回一个浮点数,代表当前请求创建时的时间戳(包括毫秒作为小数部分)。

2016-03-15 23:25:21
stackoverflow用户4896468
stackoverflow用户4896468

获取当前毫秒数。

os.time()

os.time()
return sec // 只返回秒数

posix.clock_gettime(clk)

https://luaposix.github.io/luaposix/modules/posix.time.html#clock_gettime

require'posix'.clock_gettime(0)
return sec, nsec

linux/time.h // man clock_gettime

/*
 * 各种系统时钟的 ID(用于 POSIX.1b 间隔计时器):
 */
#define CLOCK_REALTIME                  0
#define CLOCK_MONOTONIC                 1
#define CLOCK_PROCESS_CPUTIME_ID        2
#define CLOCK_THREAD_CPUTIME_ID         3
#define CLOCK_MONOTONIC_RAW             4
#define CLOCK_REALTIME_COARSE           5
#define CLOCK_MONOTONIC_COARSE          6

socket.gettime()

http://w3.impa.br/~diego/software/luasocket/socket.html#gettime

require'socket'.gettime()
return sec.xxx

就像 waqas 所说


比较和测试

get_millisecond.lua

local posix=require'posix'
local socket=require'socket'

for i=1,3 do
    print( os.time() )
    print( posix.clock_gettime(0) )
    print( socket.gettime() )
    print''
    posix.nanosleep(0, 1) -- sec, nsec
end

输出

lua get_millisecond.lua
1490186718
1490186718      268570540
1490186718.2686

1490186718
1490186718      268662191
1490186718.2687

1490186718
1490186718      268782765
1490186718.2688
2017-03-22 12:54:50
stackoverflow用户436794
stackoverflow用户436794

如果你正在使用 OpenResty,那么它通过使用 ngx.now() 函数提供了内置的毫秒级时间精度。虽然如果你想要更细粒度的毫秒级精度,那么你可能需要先调用 ngx.update_time()。或者,如果你想更进一步...

如果你正在使用启用了 luajit 的环境,比如 OpenResty,那么你还可以使用 ffi 访问基于 C 的时间函数,如 gettimeofday() 例如:(注意:如果你通过 OpenResty 中的 content_by_lua_file 反复运行它,那么 pcall 检查 struct timeval 是否存在是必要的 - 如果没有它,你会遇到诸如 attempt to redefine 'timeval' 的错误)

if pcall(ffi.typeof, "struct timeval") then
        -- 检查是否已定义。
else
        -- 未定义!让我们定义它!
        ffi.cdef[[
           typedef struct timeval {
                long tv_sec;
                long tv_usec;
           } timeval;

        int gettimeofday(struct timeval* t, void* tzp);
]]
end
local gettimeofday_struct = ffi.new("struct timeval")
local function gettimeofday()
        ffi.C.gettimeofday(gettimeofday_struct, nil)
        return tonumber(gettimeofday_struct.tv_sec) * 1000000 + tonumber(gettimeofday_struct.tv_usec)
end

那么,新的 lua gettimeofday() 函数可以从 lua 中调用,以提供到 微秒 级别的时钟时间精度。

实际上,可以采用类似的方法使用 clock_gettime() 来获得 纳秒 精度。

2019-05-09 17:05:25
stackoverflow用户2750743
stackoverflow用户2750743

如果你的环境是 Windows 并且你可以访问系统命令,你可以使用 io.popen(command) 命令以分毫秒精度获取时间:

local handle = io.popen("echo %time%")
local result = handle:read("*a")
handle:close()

结果将会是 hh:mm:ss.cc 格式的字符串:(包括行尾换行符)

"19:56:53.90\n"

请注意,它是在本地时区,因此您可能只想提取 .cc 部分,并将其与 os.time() 中的纪元秒组合。

2021-02-27 19:20:46
stackoverflow用户34799
stackoverflow用户34799

如果你在一个可执行 GNU 兼容实现的 date 系统上,这里是一个一行的代码获取毫秒级别的 Epoch 时间:

local function gethammertime()
  return tonumber(assert(assert(io.popen'date +%s%3N'):read'a'))
end

请注意,assert 调用是必要的,以确保读取或打开 date 的任何失败都会分别传播错误。还要注意,这依赖于垃圾收集(或在 Lua 5.4 中的 finalizers)来关闭进程句柄:如果使用早于 5.4 版本的 Lua,并且担心资源耗尽问题,您可能需要像 Klesun 的基于 Windows 的答案 一样将其扩展为三行,并显式关闭句柄。

2021-05-21 07:51:31