跳到主要内容

Lua 日期时间

Lua 的日期时间能力主要来自 os 库。你会经常用到 os.time()os.date()os.difftime()os.clock()

获取当前时间戳

os.time() 不带参数时返回当前时间戳:

main.lua
print(os.time())

输出类似:

1784770000

具体数值会随运行时间变化。

格式化当前日期

os.date() 可以把时间格式化为字符串:

main.lua
print(os.date("%Y-%m-%d"))
print(os.date("%H:%M:%S"))
print(os.date("%Y-%m-%d %H:%M:%S"))

输出类似:

2026-07-23
02:30:00
2026-07-23 02:30:00

常见格式:

格式说明
%Y四位年份
%m月份,01-12
%d日期,01-31
%H小时,00-23
%M分钟,00-59
%S秒,00-60
%w星期,0-6,星期日为 0

获取时间表

如果你把 os.date() 的第一个参数写成 "*t",会得到一个 table:

main.lua
local now = os.date("*t")

print(now.year)
print(now.month)
print(now.day)
print(now.hour)
print(now.min)
print(now.sec)

输出取决于当前时间。

构造指定时间

os.time() 也可以接收一个 table,构造指定时间的时间戳:

main.lua
local timestamp = os.time({
year = 2026,
month = 7,
day = 23,
hour = 12,
min = 0,
sec = 0,
})

print(timestamp)
print(os.date("%Y-%m-%d %H:%M:%S", timestamp))

输出中的时间戳会受本地时区影响。

计算时间差

os.difftime(t2, t1) 返回两个时间戳之间相差的秒数:

main.lua
local start_time = os.time({
year = 2026,
month = 7,
day = 23,
hour = 10,
})

local end_time = os.time({
year = 2026,
month = 7,
day = 23,
hour = 12,
})

print(os.difftime(end_time, start_time))

输出:

7200.0

7200 秒就是 2 小时。

UTC 时间

os.date("!*t") 可以获取 UTC 时间表:

main.lua
local utc = os.date("!*t")
print(utc.year, utc.month, utc.day, utc.hour)

! 表示按 UTC 格式化,而不是本地时区。

测量 CPU 时间

os.clock() 返回程序消耗的 CPU 时间,常用于粗略测量代码运行开销:

main.lua
local start_clock = os.clock()

local sum = 0
for i = 1, 1000000 do
sum = sum + i
end

local elapsed = os.clock() - start_clock
print(sum)
print(string.format("elapsed: %.4f seconds", elapsed))

输出会因机器不同而不同。

备注

os.clock() 测的是 CPU 时间,不一定等于真实墙钟时间。需要高精度计时或异步定时器时,通常要使用宿主环境或第三方库。

小结

你需要掌握:

  • os.time() 获取或构造时间戳。
  • os.date() 格式化时间。
  • os.date("*t") 返回本地时间 table。
  • os.date("!*t") 返回 UTC 时间 table。
  • os.difftime() 计算时间差。
  • os.clock() 可用于粗略性能测量。