信息
· 文章中可能会出现一些错误,希望大佬们可以在评论区指出;
07-日期和时间
Lua语言的标准库提供了两个用于操作日期和时间的函数:os.time()和os.date()。
os.time()
该函数会根据调用返回时间戳:
-
无参数直接调用,直接返回当前时间的时间戳:
os.time() --> 1790358744, 即 2026-09-26 01:52:24(时区Asia.Shanghai) -
提供参数日期表再调用,返回日期表所描述时间的时间戳:
os.time({year = 2026, month = 9, day = 26, hour = 1, min = 52, sec = 24})--> 1790358744此外,日期表的字段定义与取值范围如下表所示:
日期表的字段定义和取值范围点击展开/折叠代码
字段 释义 取值范围 os.time()必需year年份 任意年份 是 month月份 1~12 是 day日期 1~31 是 hour时 0~23 - min分 0~59 - sec秒 0~60
(防止出现闰秒)- wday星期
(第一天为周日)1~7 忽略 yday一年的第几天 1~366 忽略 isdst是否使用夏令时 true/false 忽略 可以发现该表并未包含程序所在时区的信息,涉及到多时区的计算需要针对性解析。
os.date()
该函数会根据调用返回指定时间戳的日期表或格式化字符串:
-
提供参数
"*t"和时间戳(可选,默认为当前时间),返回日期表:local dateTable = os.date("*t", 1790358744)for k, v in pairs(dateTable) doprint(k .. " " .. tostring(v))end--[[美化后的输出: {year = 2026, month = 9, day = 26, hour = 1,min = 52, sec = 24, wday = 7, yday = 269,isdst = false}--]] -
提供目标格式字符串和时间戳(可选),返回格式化日期字符串,内容会根据程序所在地区本地化:
os.date("%d/%m/%y", 1790358744) --> 26/09/26其中,目标格式字符串的指示符如下表所示:
指示符点击展开/折叠代码
指示符 释义 %a星期简写(Wed) %A星期全名(Wednesday) %b月份简写(Nov) %B月份全名(November) %c日期和时间(09/16/98 23:48:10) %d一个月的第几天(1~31) %H24小时制的小时(0~23) %I12小时制的小时(1~12) %j一年的第几天(1~365) %m月份(1~12) %M分钟(0~59) %pam/pm %S秒(0~60) %w星期(0~6,周日为0) %W一年的第几周(0~53) %x日期(09/16/98) %X时间(23:48:10) %y两位数年份(0~99) %Y完整年份 %z时区(-0300) %%百分号 -
没有任何参数,返回以
%c为格式,当前时间为时间戳的格式化日期字符串;
计算日期与时间
可以利用日期表进行高效的日期与时间计算:
local t = os.date("*t") --> 2026/09/26
-- 计算3天后的日期
t.day = t.day + 3
print(os.date("%Y/%m/%d", os.time(t))) --> 2026/09/29
os.time()的归一化
os.time()函数会对传入的日期表进行归一化操作,例如要计算3月31日的后一个月:
t.month = t.month + 1,计算1个月后的日期,即4月31日;- 由于4月31日不合法,进行归一化操作,最终结果为5月1日;
由于归一化操作的存在,在将结果5月1日减去一个月后回不到3月31日,而是4月1日。出现这种结果是由于日期规则本身的问题,Lua语言只是忠实地进行了顺延计算。
os.difftime()
该函数返回两个指定时间戳的时间差,单位为秒。
os.clock()
该函数会返回程序消耗的CPU时间,单位为秒,精度视平台而定。例如在性能测试中可以这样使用:
local st = os.clock()
local s = 0
for i = 1, 10000000 do
s = s + i
end
print(string.format("Used time: %.2fs\n", os.clock() - st)) --> Used time: 0.04s
参考资料
- 《Lua程序设计 (第4版)》
- 【唐老狮】Unity热更新之Lua语法