data提供了所有的日期和時間的功能,下面將這兩個函數分開學習。
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函數:
該函數有兩個參數:
第一個參數爲格式字符串,指定了期望的表示形式;
第二個參數是日期和時間的數字,默認爲當前日期和時間。<可不填>
其中第一個參數中,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") then
return string.format("%02d/%02d/%02d", day, month, year);
elseif (fmt == "MM/DD/YY") then
return string.format("%02d/%02d/%02d", month, day, year);
else
return string.format("%02d/%02d/%02d", year, month, day);
end
end
local fmt_hms = function(hour, min, sec, TIME_24H_Flag)
if (nil ~= sec) then
assert((nil ~= hour) and (nil ~= min));
if (TIME_24H_Flag) then
return string.format("%02d:%02d:%02d", hour, min, sec);
else
local h = math.floor(tonumber(hour));
if (h < 12) then
if (0 == h) then h = 12; end
return string.format("%02d:%02d:%02d AM", h, min, sec);
else
if (12 == h) then h = 24; end
return string.format("%02d:%02d:%02d PM", h-12, min, sec);
end
end
elseif (nil ~= min) then
assert(nil ~= hour);
if (TIME_24H_Flag) then
return string.format("%02d:%02d", hour, min);
else
local h = math.floor(tonumber(hour));
if (h < 12) then
if (0 == h) then h = 12; end
return string.format("%02d:%02d AM", h, min);
else
if (12 == h) then h = 24; end
return string.format("%02d:%02d PM", h-12, min);
end
end
else
assert(nil ~= hour);
if (TIME_24H_Flag) then
return string.format("%02d", hour);
else
local h = math.floor(tonumber(hour));
if (h < 12) then
if (0 == h) then h = 12; end
return string.format("%02d:00 AM", h);
else
if (12 == h) then h = 24; end
return string.format("%02d:00 PM", h-12);
end
end
end
end
local 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)) then
if (("boolean" == type(wday_flag)) and (wday_flag)) then
local 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]);
else
return string.format("%s %s", fmt_date(year, mon, mday), fmt_hms(hour, min, sec));
end
end
if ((nil ~= year) and (nil ~= mon) and (nil ~= mday) and (nil == hour) and (nil == min) and (nil == sec)) then
if (("boolean" == type(wday_flag)) and (wday_flag)) then
local 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]);
else
return string.format("%s", fmt_date(year, mon, mday));
end
end
if ((nil == year) and (nil == mon) and (nil == mday) and (nil ~= hour) and (nil ~= min)) then
return string.format("%s", fmt_hms(hour, min, sec));
end
end
--測試
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/22
print(fmt_time(false, nil, nil, nil, hour, min, sec)); --11:09:13 AM