【读书笔记】编程实操-日期和时间(五)

目录

一. 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字段表示布尔类型,如果使用夏时令为真。

二. 函数 os.time(返回时间戳)

        2.1 不带任何参数调用函数 os.time,会以数字(时间戳)形式返回当前的日期和时间:

        2.2 以一个日期表作为参数调用 函数 os.time,那么该函数会返回该表中所描述日期和时间对应的数字(时间戳)。year、month和day字段是必需的,hour、min和sec字段如果没有提供的话默认为12:00:00,其他字段则被忽略

三. 函数os.date (根据时间戳返回日期表 或字符串)

        3.1 格式化字符串 "*t" 输出日期表

        3.2 日期表字段的有效范围(除了 isdst)

        3.3 根据指示符 返回字符串

四. 日期和时间处理

五. 函数os.difftime 用于计算两个时间之间的差值,该函数以秒为单位返回两个指定数字形式 表示的时间的差值。

        5.1 使用函数difftime 可以获取指定日期相对任意时刻的秒数:

        5.2 通过归一化,可以将秒表示的时间转换为时间戳

            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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值