Lua中日期和時間函數詳解

最近在做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") 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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章