操作系统时间

标准 Lua os 时间函数。提供用于时间戳、日期格式化和时间计算的真实墙上时钟时间。

加载

全局 os 表。无需 require。

os.time()
os.date()
os.clock()
os.difftime()

获取时间戳

获取 Unix 时间戳(自 1970 年 1 月 1 日 UTC 以来的秒数):

-- 当前时间戳
local now = os.time()  -- 1718462445

-- 指定日期/时间
local t = os.time({
    year = 2024,
    month = 12,
    day = 25,
    hour = 10,
    min = 30,
    sec = 0
})

签名: os.time([spec]) -> integer

参数:

字段 类型 默认值 描述
year integer 当前年份 四位数年份(例如 2024)
month integer 当前月份 月份 1-12
day integer 当前日期 月中日期 1-31
hour integer 0 小时 0-23
min integer 0 分钟 0-59
sec integer 0 秒 0-59

不带参数调用时返回当前 Unix 时间戳。

带表调用时,任何缺失的字段使用上面显示的默认值。yearmonthday 字段如果未指定则默认为当前日期。

-- 仅日期(时间默认为午夜)
os.time({year = 2024, month = 6, day = 15})

-- 部分指定(填充当前年/月)
os.time({day = 1})  -- 当月第一天

格式化日期

将时间戳格式化为字符串或返回日期表:

local now = os.time()

-- 默认格式 os.date() -- "Sat Jun 15 14:30:45 2024"

-- 自定义格式 os.date("%Y-%m-%d", now) -- "2024-06-15" os.date("%H:%M:%S", now) -- "14:30:45" os.date("%Y-%m-%dT%H:%M:%S", now) -- "2024-06-15T14:30:45"

-- UTC 时间(格式前加 !) os.date("!%Y-%m-%d %H:%M:%S", now) -- UTC 而非本地时间

-- 日期表 local t = os.date("*t", now)

签名: os.date([format], [timestamp]) -> string | table

参数 类型 默认值 描述
format string "%c" 格式字符串,"*t" 返回表
timestamp integer 当前时间 要格式化的 Unix 时间戳

格式说明符

代码 输出 示例
%Y 4 位年份 2024
%y 2 位年份 24
%m 月份 (01-12) 06
%d 日期 (01-31) 15
%H 24 小时制小时 (00-23) 14
%I 12 小时制小时 (01-12) 02
%M 分钟 (00-59) 30
%S 秒 (00-59) 45
%p AM/PM PM
%A 星期全名 Saturday
%a 星期缩写 Sat
%B 月份全名 June
%b 月份缩写 Jun
%w 星期几 (0-6, Sunday=0) 6
%j 年中日 (001-366) 167
%U 周数 (00-53) 24
%z 时区偏移 -0700
%Z 时区名称 PDT
%c 完整日期/时间 Sat Jun 15 14:30:45 2024
%x 仅日期 06/15/24
%X 仅时间 14:30:45
%% 字面 % %

日期表

当格式为 "*t" 时返回表:

local t = os.date("*t")
字段 类型 描述 示例
year integer 四位数年份 2024
month integer 月份 (1-12) 6
day integer 月中日期 (1-31) 15
hour integer 小时 (0-23) 14
min integer 分钟 (0-59) 30
sec integer 秒 (0-59) 45
wday integer 星期几 (1-7, Sunday=1) 7
yday integer 年中日 (1-366) 167
isdst boolean 夏令时 false

使用 "!*t" 获取 UTC 日期表。

测量经过时间

获取 Lua 运行时启动以来经过的秒数:

local start = os.clock()

-- 执行工作
for i = 1, 1000000 do end

local elapsed = os.clock() - start
print(string.format("Took %.3f seconds", elapsed))

签名: os.clock() -> number

时间差

获取两个时间戳之间的差值(秒):

local t1 = os.time({year = 2024, month = 1, day = 1})
local t2 = os.time({year = 2024, month = 12, day = 31})

local diff = os.difftime(t2, t1)  -- t2 - t1
local days = diff / 86400
print(days)  -- 365

签名: os.difftime(t2, t1) -> number

参数 类型 描述
t2 integer 较晚的时间戳
t1 integer 较早的时间戳

返回 t2 - t1(秒)。如果 t1 > t2 可能为负数。

平台常量

标识运行时的常量:

os.platform  -- "wippy"