概述
Lua语言对日期和时间有两种表示方式:
第1种表示方式是一个数字,这个数字通常是一个整型数。
第2种表示方式是一个表-日期表
日期表具有以下几个重要的字段: year、month、day、hour、 min、sec、wday、yday和isdst,除isdst以外的所有字段均为整型数。
- 前6个字段的含义非常明显,
- wday字段表示本周中的第几天(第1天为星期天);
- yday字段表示当年中的第几天(第1天是1月1日);
- isdst字段表示布尔类型,如果使用夏时令则为真。
例如,Sep 16, 1998,23:48:10((星期三)对应的表是:
{year = 1998,month = 9, day = 16,yday = 259, wday = 4,hour = 23,min = 48,sec = 10, isdst = false}
函数os.time
不带任何参数调用函数os.time,会以数字形式返回当前的日期和时间
os.time() -->1650444929 时间戳
local date = 1650444929
local dayYear = 365 -- 1年天数
local secHour = 60 * 60 -- 1小时的秒数
local secDay = secHour * 24 -- 1天的秒数
local secYear = secDay * dayYear -- 1年的秒数
--年
print(date // secYear + 1970)
-- 小时(UTC格式)
print(date % secDay // secHour)
--分钟
print(date % secHour // 60)
--秒
print(date % 60)
如果以一个日期表作为参数调用函数os.time
,那么该函数会返回该表中所描述日期和时间对应的数字。year 、month
和day
字段是必需的,hour、 min
和sec
字段如果没有提供的话则默认为12:00:00,其余字段(包括wday
和yday
)则会被忽略。
os.time({year=2015, month=8, day=15, hour=12, min=45, sec=20}) --> 1439653520
os.time({year=1970, month=1, day=1, hour=}) --> 10800
os.time({year=1970, month=1, day=1, hour=0, sec=1}) --> 10801
os.time(iyear=1970, month=1, day=1}) --> 54000
请注意,10800是3个小时的秒数,54000则是10800加上12个小时的秒数。
函数os.date
函数os.date在一定程度上是函数os.time的反函数(尽管这个函数的名字写的是date),它可以将一个表示日期和时间的数字转换为某些高级的表示形式,要么是日期表要么是字符串。该函数的第1个参数是描述期望表示形式的格式化字符串,第2个参数是数字形式的日期和时间(如果不提供,则默认为当前日期和时间)。
要生成一个日期表,可以使用格式化字符串"*t"
。例如,调用函数os.date("*t",906000490)
会返回下列表:
对于任何有效的时间t,
os.time(os.date("*t",t))==t
均成立。
字段 | 描述 |
---|---|
year | 一整年 |
month | 1 ~ 12 |
day | 1 ~ 31 |
hour | 0 ~ 23 |
min | 0 ~ 59 |
sec | 0 ~ 60 |
wday | 1 ~ 7 |
yday | 1 ~ 366 |
秒的最大范围是60,允许闰秒的存在。
对于其他格式化字符串,函数os.date
会将日期格式化为一个字符串,该字符串是根据指定的时间和日期信息对特定的指示符进行了替换的结果。所有的指示符都以百分号开头紧跟一个字母
例如:
print(os.date("a %A in %B")) --> a Wednesday in April
print(os.date("%d/%m/%Y",906000490)) -->16/09/1998
所有的表现形式取决于当前的区域设置。
指示符 | 描述 |
---|---|
%a | 星期几的简写(例如,Wed) |
%A | 星期几的全名(例如,Wednesday) |
%b | 月份的简写(例如,Sep) |
%B | 月份的全名(例如,September) |
%c | 日期和时间(例如,09/16/98 23:48:10) |
%d | 一个月中的第几天(16)[01-31] |
%H | 24小时制中的小时数(23) [00-23] |
%I | 12小时制中的小时数(11)[01-12] |
%j | 一年中的第几天(259)[001-365] |
%m | 月份(09)[01-12] |
%M | 分钟(48)[00-59] |
%p | "am”或"pm" (pm) |
%S | 秒数(10)[00-60] |
%w | 星期(3)[0-6 = Sunday-Saturday] |
%W | 一年中的第几周(37)[00-53] |
%x | 日期(例如,09/16/98) |
%X | 时间(例如,23:48:10) |
%y | 两位数的年份(98)[00-99] |
%Y | 完整的年份(1998) |
%z | 时区(例如,-0300) |
%% | 百分号 |
t = 906000490
-- ISO 8601格式的日期
print(os.date( "%Y-%m-%d", t)) --> 1998-09-16
-- IS0 8601格式的日期和时间
print(os.date("%Y-%m-%d T%H:%M:%S", t)) --> 1998-09-16T23:48:10
-- IS0 8601格式的序数日期
print(os.date( "%Y-%j", t)) --> 1998-259
如果不带任何参数调用函数os.date,那么该函数会使用格式%c。如果需要诸如dd/mm/yyyy这样的固定表示形式,那么就必须显式地使用诸如"%d /%m/%Y”这样的格式化字符串。
日期和时间处理
t = os.date("*t") -- 获取当前时间
print(os.date("%Y/%m/%d", os.time(t))) --> 2022/04/20
t.day = t.day + 40 -- 获取40天后
print(os.date("%Y/%m/%d", os.time(t))) --> 2022/05/30
--将日期时间归一化
t = os.date("*t")
print(t.day,t.month) --> 20 4
t.day = t.day - 40
print(t.day, t.month) --> -20 4
t = os.date("*t", os.time(t))
print(t.day, t.month) --> 11 3
函数difftime用来计算两个时间之间的差值,该函数以秒为单位返回两个指定数字形式表示的时间的差值。
local t5_3 = os.time({year=2015, month=1, day=12})
local t5_2 = os.time({year=2011, month=12, day=16})
local d = os.difftime(t5_3,t5_2)
print(d // (24 * 3600)) --> 1123.0