Lua标准库提供了2个操作日期和时间的函数。
时间函数 os.time
不带参数os.time()结果是一个整型数字,该数字代表从纪元(1970-01-01 00:00:00
UTC)起经过的秒数,该数值与时区有关联,在不同时区值的情况下调用会返回不同的值。
print(os.time()) ->1646988781(北京时区)
带参数,参数必须是date类型的表,一个date类型的表如下:
{year = 2022,month = 3,day = 11,hour = 16,min = 31,sec = 45,isdst = false,wday
= 6,yday = 70}
year 年份
month 月份 (1-12)
day 日 (1-31)
hour 时
min 分
sec 秒
wday 一周中的星期几 (第一天代表周日)
yday 一年中的第几天
isdst 是否使用夏令时
os.time的参数表中 year、month、day是必须的参数,特别需要注意的是当没有hour值时,默认hour=12,
min和sec的默认值则是0。
print(os.time({year = 2022, month = 3, day = 11}))
->1646971200 (北京时区)
在实际的计算中,需要考虑时区带来的问题。
日期函数 os.date ( [format [, time]] )
在某种程度上可以认为os.date是os.time的反函数。
不带参数 os.date()返回字符串,表示当前的日期,月份 周几 日 时分秒 年份
print(os.date()) -> Fri Mar 11 16:46:51 2022
带参数,参数有一些固定的指示符,代表特定的含义。以下是一些常用的指示符
%y 年份缩写 (22)
%Y 年份完整 (2022)
%m 月份
%d 日,一个月中第几天
%H 小时,24小时制
%I 小时,12小时制
%M 分钟
%S 秒数
%w 星期几
%W 一年中第几周
%j 一年中第几天
第一个参数通常是有指示符组成
第2个参数不存在,默认值是os.time()。
若第一个参数以 ! 开头时,将会按照格林尼治时间进行格式化。
若第一个参数是 "*t" 时, 则会返回一个完整的日期表。
print(os.date("*t")) ->table: 00000000F86E8AA0
{year = 2022,month = 3,day = 11,hour = 17,min = 11,sec =
45,isdst = false,wday = 6,yday = 70}
时间差计算函数os.difftime
可以用以下代码来计算一个系统时区:
function GetSystemTimeZone() return os.difftime(os.time(os.date("!*t",
os.time())), os.time()) -- 秒 end
常用一些函数封装
获取当天已过秒数
function GetPassSecInDay() local t = os.date("*t", os.time()) t.hour = 0 t.min
= 0 t.sec = 0 return os.time() - os.time(t) end
常见错误:
os.time 的时间戳是一个int 32位值的数字,int32最大值是2147483647,对应转成时间是2038-01-19
11:14:07 ,在int32的lua版本中,超过该时间就会报错。