在 Lua 中,函數(shù) time、date 和 difftime 提供了所有的日期和時間功能。
在 OpenResty 的世界里,不推薦使用這里的標準時間函數(shù),因為這些函數(shù)通常會引發(fā)不止一個昂貴的系統(tǒng)調(diào)用,同時無法為 LuaJIT JIT 編譯,對性能造成較大影響。推薦使用 ngx_lua 模塊提供的帶緩存的時間接口,如 ngx.today
, ngx.time
, ngx.utctime
,
ngx.localtime
, ngx.now
, ngx.http_time
,以及 ngx.cookie_time
等。
所以下面的部分函數(shù),簡單了解一下即可。
如果不使用參數(shù) table 調(diào)用 time 函數(shù),它會返回當前的時間和日期(它表示從某一時刻到現(xiàn)在的秒數(shù))。如果用 table 參數(shù),它會返回一個數(shù)字,表示該 table 中 所描述的日期和時間(它表示從某一時刻到 table 中描述日期和時間的秒數(shù))。table 的字段如下:
字段名稱 | 取值范圍 |
---|---|
year | 四位數(shù)字 |
month | 1--12 |
day | 1--31 |
hour | 0--23 |
min | 0--59 |
sec | 0--61 |
isdst | boolean(true表示夏令時) |
對于 time 函數(shù),如果參數(shù)為 table,那么 table 中必須含有 year、month、day 字段。其他字缺省時段默認為中午(12:00:00)。
示例代碼:(地點為北京)
print(os.time()) -->output 1438243393
a = { year = 1970, month = 1, day = 1, hour = 8, min = 1 }
print(os.time(a)) -->output 60
返回 t1 到 t2 的時間差,單位為秒。
示例代碼:
local day1 = { year = 2015, month = 7, day = 30 }
local t1 = os.time(day1)
local day2 = { year = 2015, month = 7, day = 31 }
local t2 = os.time(day2)
print(os.difftime(t2, t1)) -->output 86400
把一個表示日期和時間的數(shù)值,轉換成更高級的表現(xiàn)形式。其第一個參數(shù) format 是一個格式化字符串,描述了要返回的時間形式。第二個參數(shù) time 就是日期和時間的數(shù)字表示,缺省時默認為當前的時間。使用格式字符 "*t",創(chuàng)建一個時間表。
示例代碼:
local tab1 = os.date("*t") --返回一個描述當前日期和時間的表
local ans1 = "{"
for k, v in pairs(tab1) do --把tab1轉換成一個字符串
ans1 = string.format("%s %s = %s,", ans1, k, tostring(v))
end
ans1 = ans1 .. "}"
print("tab1 = ", ans1)
local tab2 = os.date("*t", 360) --返回一個描述日期和時間數(shù)為360秒的表
local ans2 = "{"
for k, v in pairs(tab2) do --把tab2轉換成一個字符串
ans2 = string.format("%s %s = %s,", ans2, k, tostring(v))
end
ans2 = ans2 .. "}"
print("tab2 = ", ans2)
-->output
tab1 = { hour = 17, min = 28, wday = 5, day = 30, month = 7, year = 2015, sec = 10, yday = 211, isdst = false,}
tab2 = { hour = 8, min = 6, wday = 5, day = 1, month = 1, year = 1970, sec = 0, yday = 1, isdst = false,}
該表中除了使用到了 time 函數(shù)參數(shù) table 的字段外,這還提供了星期(wday,星期天為 1)和一年中的第幾天(yday,一月一日為 1)。 除了使用 "*t" 格式字符串外,如果使用帶標記(見下表)的特殊字符串,os.date 函數(shù)會將相應的標記位以時間信息進行填充,得到一個包含時間的字符串。 表如下:
格式字符 | 含義 |
---|---|
%a | 一星期中天數(shù)的簡寫(例如:Wed) |
%A | 一星期中天數(shù)的全稱(例如:Wednesday) |
%b | 月份的簡寫(例如:Sep) |
%B | 月份的全稱(例如:September) |
%c | 日期和時間(例如:07/30/15 16:57:24) |
%d | 一個月中的第幾天[01 ~ 31] |
%H | 24小時制中的小時數(shù)[00 ~ 23] |
%I | 12小時制中的小時數(shù)[01 ~ 12] |
%j | 一年中的第幾天[001 ~ 366] |
%M | 分鐘數(shù)[00 ~ 59] |
%m | 月份數(shù)[01 ~ 12] |
%p | “上午(am)”或“下午(pm)” |
%S | 秒數(shù)[00 ~ 59] |
%w | 一星期中的第幾天[1 ~ 7 = 星期天 ~ 星期六] |
%x | 日期(例如:07/30/15) |
%X | 時間(例如:16:57:24) |
%y | 兩位數(shù)的年份[00 ~ 99] |
%Y | 完整的年份(例如:2015) |
%% | 字符'%' |
示例代碼:
print(os.date("today is %A, in %B"))
print(os.date("now is %x %X"))
-->output
today is Thursday, in July
now is 07/30/15 17:39:22