跳到主要内容
信息
· 文章中可能会出现一些错误,希望大佬们可以在评论区指出;

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) do
    print(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日的后一个月:

  1. t.month = t.month + 1,计算1个月后的日期,即4月31日;
  2. 由于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

参考资料​