Lua中日期和时间函数详解

来源:互联网 发布:软件许可合同范本 编辑:程序博客网 时间:2024/05/17 01:55
最近在做Lua脚本的时候,用到了Lua的日期和时间函数,发现其功能强大,学习一下!在Lua中,函数time和

data提供了所有的日期和时间的功能,下面将这两个函数分开学习。


time函数:


如果不带任何参数调用time,它会返回一个数字,表示当前的日期和时间,改数字为某一时刻到此刻的秒数。
如: local current_time = os.time(); -- 返回的结果可能是 1503365680 这样一串数字

time还可以用一个table作为一个参数调用它,它会返回从某一时刻都table中时刻的秒数,table参数内容
year   一个完整的年份
month 01 - 12
day 01 - 31
hour 00 - 23
min 00 - 59
sec 00 - 59
isdst 一个布尔值,true表示夏令时
其中年月份必须填写,不可省略,后面的其他字段可填可不填。
思考:既然只需要填写年月日就可以获得一个时刻都年月日的秒数,那么lua默认表中的时分秒为多少呢?
于是笔者做了以下测试:
local time1 = os.time{year = 2000, month = 1, day = 1};
print(time1); -- 结果为946 699 200
local time2 = os.time{year = 2000, month = 1, day = 1, hour = 12};
print(time2); -- 结果为946 699 200
local time3 = os.time{year = 2000, month = 1, day = 1, hour = 12, min = 1};
print(time3); -- 结果为946 699 260
local time4 = os.time{year = 2000, month = 1, day = 1, hour = 12, min = 1, sec = 1};
print(time4); -- 结果为946 699 261
通过测试可以看出,Lua中当你参数table值填年月日时,Lua默认hour = 12, min = 0, sec = 0

data函数:


函数data是time的一个反函数,它可以将一个表示日期和时间的数字转换成某些高级的表现形式。
该函数有两个参数:
第一个参数为格式字符串,指定了期望的表示形式;
第二个参数是日期和时间的数字,默认为当前日期和时间。<可不填>
其中第一个参数中,date函数支持以下这些格式:
%a 一个星期中天数的简写(如:Wed) 
%A 一个星期中天数的全称(如: Wednesday) 
%b 月份的简写(如: Sep) 
%B 月份的全称(如:September) 
%c 日期和时间(如: 08/22/2017 10:50:05) 
%d 一个月中的第几天(22) [0 - 31] 
%H 24小时中的小时数(15) [0 - 23]  
%I 12小时中的小时数(8)[1 - 12]  

%j 一年中的第几天(259)[1 - 366]   

%M 分钟数 (48) [0 - 59] 

%m 月份数 (09) [1 - 12] 
%p "上午(am)"或"下午(pm)" (如: pm) 
%S 秒数(10) [0 - 59] 
%w 一个星期中的第几天(3) [0 - 6 周天-周六] 
%x 日期(如:08/22/17) 
%X 时间(如:10:50:05) 
%y 两位数的年份(17) [00 - 99] 
%Y 完整的年份(2017) 
%% 字符'%' 

除了以上格式外,data函数还阔以通过字符串"*t",其返回一个table如
local date = os.date("*t", os.time());
--结果为date = {year = 2017, month = 8, day = 22, yday = 234, wday = 3,

hour = 10, min = 46, sec = 52, isdst = false}


应用:

我们在Lua中经常会用到这两个函数来格式化我们的日期和时间,然后在自由组合自己想要的格式,下面来写几个接口实践下:

local fmt_date = function(year, month, day, fmt)if (fmt == "DD/MM/YY") thenreturn string.format("%02d/%02d/%02d", day, month, year);elseif (fmt == "MM/DD/YY") thenreturn string.format("%02d/%02d/%02d", month, day, year);elsereturn string.format("%02d/%02d/%02d", year, month, day);endendlocal fmt_hms = function(hour, min, sec, TIME_24H_Flag)if (nil ~= sec) thenassert((nil ~= hour) and (nil ~= min));if (TIME_24H_Flag) thenreturn string.format("%02d:%02d:%02d", hour, min, sec);elselocal h = math.floor(tonumber(hour));if (h < 12) thenif (0 == h) then h = 12; endreturn string.format("%02d:%02d:%02d AM", h, min, sec);elseif (12 == h) then h = 24; endreturn string.format("%02d:%02d:%02d PM", h-12, min, sec);endendelseif (nil ~= min) thenassert(nil ~= hour);if (TIME_24H_Flag) thenreturn string.format("%02d:%02d", hour, min);elselocal h = math.floor(tonumber(hour));if (h < 12) thenif (0 == h) then h = 12; endreturn string.format("%02d:%02d AM", h, min);elseif (12 == h) then h = 24; endreturn string.format("%02d:%02d PM", h-12, min);endendelseassert(nil ~= hour);if (TIME_24H_Flag) thenreturn string.format("%02d", hour);elselocal h = math.floor(tonumber(hour));if (h < 12) thenif (0 == h) then h = 12; endreturn string.format("%02d:00 AM", h);elseif (12 == h) then h = 24; endreturn string.format("%02d:00 PM", h-12);endendendendlocal fmt_time = function(wday_flag, year, mon, mday, hour, min, sec)if ((nil ~= year) and (nil ~= mon) and (nil ~= mday) and (nil ~= hour) and (nil ~= min) and (nil ~= sec)) thenif (("boolean" == type(wday_flag)) and (wday_flag)) thenlocal week = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};local w = os.date("%w", os.time{year=year, month=mon, day=mday});local day = math.floor(tonumber(w)) + 1;return string.format("%s %s %s", fmt_date(year, mon, mday), fmt_hms(hour, min, sec), week[day]);elsereturn string.format("%s %s", fmt_date(year, mon, mday), fmt_hms(hour, min, sec));endendif ((nil ~= year) and (nil ~= mon) and (nil ~= mday) and (nil == hour) and (nil == min) and (nil == sec)) thenif (("boolean" == type(wday_flag)) and (wday_flag)) thenlocal week = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};local w = os.date("%w", os.time{year = year, month = mon, day = mday});local day = math.floor(tonumber(w)) + 1;return string.format("%s %s", fmt_date(year, mon, mday), week[day]);elsereturn string.format("%s", fmt_date(year, mon, mday));endendif ((nil == year) and (nil == mon) and (nil == mday) and (nil ~= hour) and (nil ~= min)) thenreturn string.format("%s", fmt_hms(hour, min, sec));endend--测试local time = os.date("%Y/%m/%d %H:%M:%S", os.time());local year, mon, mday, hour, min, sec = string.match(time, "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)");print(fmt_time(false, year, mon, mday));  --2017/08/22print(fmt_time(false, nil, nil, nil, hour, min, sec)); --11:09:13 AM