Luaにおける日付と時間関数の詳細


最近Luaスクリプトを作っているときに、Luaの日付と時間関数を使って、その機能が強いことを発見して、勉強してみましょう!Luaでは、関数timeと
dataはすべての日付と時間の機能を提供し,以下ではこの2つの関数を別々に学習する.
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
夏時間を表すブール値
このうち年月は必ず記入しなければならないので、省略してはいけません.後の他のフィールドは記入してもいいです.
思考:年月日を記入するだけで1つの時刻のすべての年月日の秒数を得ることができる以上、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の逆関数であり、日付と時間を表す数字をいくつかの高度な表現形式に変換することができる.
この関数には2つのパラメータがあります.
最初のパラメータはフォーマット文字列で、所望の表現形式を指定します.
2番目のパラメータは日付と時刻の数値で、デフォルトは現在の日付と時刻です.
最初のパラメータでは、date関数は次のフォーマットをサポートします.
%a
1週間の日数の略記(Wedなど)
%A
1週間の日数のフルネーム(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 1年目の日付(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
2桁の年(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では、日付と時間をフォーマットするためにこの2つの関数をよく使用し、自分の望むフォーマットを自由に組み合わせて、いくつかのインタフェースの実践の下で書きます.
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