目录
1. 时间戳形式:纪元的固定日期后至今的秒数,即 Jan 01, 1970,0:00 UTC
2.1 不带任何参数调用函数 os.time,会以数字(时间戳)形式返回当前的日期和时间:
三. 函数os.date (根据时间戳返回日期表 或字符串)
五. 函数os.difftime 用于计算两个时间之间的差值,该函数以秒为单位返回两个指定数字形式 表示的时间的差值。
5.1 使用函数difftime 可以获取指定日期相对任意时刻的秒数:
5.3 os.difftime计算一段代码的执行时间,不过更好的方式时使用函数os.clock 返回程序消耗的CPU时间(单位:秒)
一. Lua 语言中表达日期和时间有两种表达方式:
1. 时间戳形式:纪元的固定日期后至今的秒数,即 Jan 01, 1970,0:00 UTC
2. 日期表:具有以下几个重要字段:year、month、day、hour、min、sec、wday、yday和 isdst,除了isdst为布尔之外所有字段均为整型数;wday字段表示本周第几天(周日是1表示),yday字段表示当年中的第几天(第一天就是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(返回时间戳)
2.1 不带任何参数调用函数 os.time,会以数字(时间戳)形式返回当前的日期和时间:
> os.time() --> 1439653520
-- 可以通过基本的数学运算分离这个数值
local date = 1439653520
local day2year = 365.242 -- 1年的天数
local sec2hour = 60 * 60 -- 1小时的秒数
local sec2day = sec2hour * 24 -- 1天的秒数
local sec2year = sec2day * day2year -- 1年的秒数
-- 年
print(date // sec2year + 1970) --> 2015.0
-- 小时(UTC格式)
print(date % sec2day // sec2hour) --> 15
-- 分钟
print(date % sec2hour // 60) --> 45
-- 秒
print(date % 60) --> 20
2.2 以一个日期表作为参数调用 函数 os.time,那么该函数会返回该表中所描述日期和时间对应的数字(时间戳)。year、month和day字段是必需的,hour、min和sec字段如果没有提供的话默认为12:00:00,其他字段则被忽略
os.time({year=2015, month=8, day=15, hour=12, min=45, sec=20})
--> 1439653520
os.time({year=1970, month=1, day=1, hour=0})
--> 10800
os.time({year=1970, month=1,day=1,hour=0,sec=1})
--> 10801
os.time({year=1970, month=1, day=1})
--> 5400
三. 函数os.date (根据时间戳返回日期表 或字符串)
在一定程度上是函数os.time的反函数,它可以将一个表示日期和时间的数字(时间戳)转换为某些高级的表现形式,要么日期表要么是字符串。
该函数的第1个参数是格式化字符串,第2个参数是时间戳(如果不提供,默认为当前时间)
3.1 格式化字符串 "*t" 输出日期表
例:要生成一个日期表,可以使用格式化字符串"*t"。例如,调用函数 os.date("*t", 9060000490)会返回下列表:
{year = 1998, month = 9, day = 16, yday = 259, wday = 4, hour = 23, min = 48, sec = 10, isdst = false}
os.time(os.date("*t", t)) == t 均成立
3.2 日期表字段的有效范围(除了 isdst)
字段 | 范围 |
year | 一整年 |
month | 1 ~ 12 |
day | 1~31 |
hour | 0~23 |
min | 0~59 |
sec | 0~60 |
wday | 1~7 |
yday | 1~366 |
3.3 根据指示符 返回字符串
所有的指示符都以百分号开头紧跟一个字母
print(os.date("a %A in %B")) --> a Tuesday in May
print(os.date("%d/%m/%Y", 906000490)) --> 16/09/1998
四. 日期和时间处理
当函数os.date创建日期表时,该表的所有字段均在有效的范围内,当我们给函数os.time传入一个日期表时,其中的字段并不需要归一化(即 日期表中的字段,不需要做归一处理。
例如,
可以传 2022年1月负一天 ,会被 函数os.time 识别为 2021年12月30日的时间戳,很是智能)
再例如:
t = os.date("*t") -- 获取当前时间
print(os.date("%Y/%m/%d", os.time(t))) --> 2015/08/18
t.day = t.day + 40 -- 直接给字段 day 赋值
print(os.date("%Y/%m/%d", os.time(t)) -- 会被os.time函数 智能地返回成真实地时间戳
t = os.date("*t")
print(t.day, t.month) --> 26 2
t.day = t.day - 40
print(t.day, t.month) --> -14 2
t = os.date("*t", os.time(t))
print(t.day, t.month) --> 17 1
-- Feb -14 被归一化为 Jan17,也就是Feb26的前40天
在操作日期时,我们必须要小心 虽然归一化是以显而易见的方式进行的,但是也可能会有一些不明显的后果
例如,如果计算 March 31 后的一个月,将会得 April 31 ,而实际士应该被归一化成 May 1 ( April 30 之后的一天) 尽管这昕上去很自然 ,但实际上 果从
结果( May )中减去一个月,得到的却是 April 不是原来 March 31 请注意,这种不一致是 日历机制导致的结果,与 Lua 语言元关
五. 函数os.difftime 用于计算两个时间之间的差值,该函数以秒为单位返回两个指定数字形式 表示的时间的差值。
以下示例计算了Lua5.2 和 Lua5.3发布时间之间间隔的天数:
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
5.1 使用函数difftime 可以获取指定日期相对任意时刻的秒数:
myepoch = os.time{year = 2000, month = 1, day = 1, hour = 0}
now = os.time{year = 2015, month = 11, day = 20}
os.difftime(now, myepoch) --> 501336000.0
5.2 通过归一化,可以将秒表示的时间转换为时间戳
T = {year = 2000, month = 1, day = 1, hour = 0}
T.sec = 501336000 -- 501336000 秒之后
os.date("%d/%m/%Y", os.time(T)) --> 20/11/2015
5.3 os.difftime计算一段代码的执行时间,不过更好的方式时使用函数os.clock 返回程序消耗的CPU时间(单位:秒)
local x = os.clock()
local s = 0
for i = 1, 100000 do s = s + i end
print(string.format("elapsed time:%.2f\n", os.clock() - x))