欢迎光临
我们一直在努力

OpenResty 获取当前毫秒数时间戳

OpenResty 获取时间的函数

函数 类型 描述
ngx.today() 缓存时间
从 nginx 的时间缓存(不像 Lua 的日期库,该时间不涉及系统调用)返回当前的日期
(格式: yyyy-mm-dd )。
这是个本地时间。
ngx.localtime() 缓存时间
返回 nginx 时间缓存(不像 Lua 的 os.date
(http://www.lua.org/manual/5.1/manual.html#pdf-os.date) 函数,该时间不
涉及系统调用)的当前时间戳(格式: yyyy-mm-dd hh:mm:ss )。
这是个本地时间。
ngx.utctime()
缓存时间
返回 nginx 时间缓存(不像 Lua 的 os.date
(http://www.lua.org/manual/5.1/manual.html#pdf-os.date) 函数,该时间不
涉及系统调用)的当前时间戳(格式: yyyy-mm-dd hh:mm:ss )。
这是个UTC时间
ngx.time()
缓存时间
获取的当前时间戳所经过的秒数。
ngx.now() 缓存时间
获取的当前时间戳所经过的时间(以秒为单位,小数部分
是毫秒)。

OpenResty 时间格式转换函数

函数 描述
ngx.cookie_time(sec)
返回一个可以用做 cookie 过期时间的格式化字符串。参数 sec 是以秒为单位的时 间戳(比如 ngx.time (page 137) 的返回)。
ngx.http_time(sec)
返回一个可以用在 http 头部时间的格式化字符串(例如,在 Last-Modified 头的使
用)。参数 sec 是以秒为单位的时间戳(比如 ngx.time (page 137) 的返回)。
ngx.parse_http_time(str)
解析 http 时间字符串(比如从 ngx.http_time (page 0) 返回内容)。成功情况下返回
秒数,错误的输入字符格式返回 nil 。

上述函数是OpenResty获取时间和操作时间的所有函数,需要注意的是以上获取时间的方式都是返回的Nginx的缓存时间,与实际的时间是存在差距的,Nginx的内部只有在处理事件的时候才会调用时间更新函数来完成对缓存时间的更新。如果我们想要获取当前准确的时间需要调用OpenResty的一个函数:”ngx.update_time()”,来完成手动更新。不过需要知道的是”ngx.update_time()”会去调用系统C函数 “gettimeofday()” 来完成对时间的获取。如果它出现在你的热代码路径上出现,会对应用的性能造成影响,所以还是要慎用。

好在OpenResty提供了强大的ffi的功能。我们可以自己完成对C函数操作,以此来减少不必要的内部操作,示例如下:

local _M = {
    _VERSION = 0.1
}
 
local mt = {__index = _M}
 
 
local ffi = require("ffi")
 
ffi.cdef[[
    struct timeval {
        long int tv_sec;
        long int tv_usec;
    };
    int gettimeofday(struct timeval *tv, void *tz);
]]
 
local tv = ffi.new("struct timeval")
 
 
function _M.get_msec()
    ffi.C.gettimeofday(tv, nil)
    return tonumber(tv.tv_sec) * 1000 + tonumber(tv.tv_usec)/1000
end
 
return _M

 

赞(0) 打赏

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏