lua Date和Time
time和date兩個函式在Lua中實現所有的時鐘查詢功能。函式time在沒有引數時返回當前時鐘的數值。(在許多系統中該數值是當前距離某個特定時間的秒數。)當為函式呼叫附加一個特殊的時間表時,該函式就是返回距該表描述的時間的數值。這樣的時間表有如下的區間:
year |
a full year |
month |
01-12 |
day |
01-31 |
hour |
01-31 |
min |
00-59 |
sec |
00-59 |
isdst |
a boolean, true if daylight saving |
前三項是必需的,如果未定義後幾項,預設時間為正午(12:00:00)。如果是在里約熱內盧(格林威治向西三個時區)的一臺Unix計算機上(相對時間為1970年1月1日,00:00:00)執行如下程式碼,其結果將如下。
-- obs: 10800 = 3*60*60 (3 hours)
print(os.time{year=1970, month=1, day=1, hour=0})
--> 10800
print(os.time{year=1970, month=1, day=1, hour=0, sec=1})
--> 10801
print(os.time{year=1970, month=1, day=1})
--> 54000 (obs: 54000 = 10800 + 12*60*60)
os.time() <== 返回當前系統的日曆時間
os.date() <== 返回本地化的時間字串,這裡是"11/28/08 17:23:37"
os.date("%x", os.time()) <== 返回自定義格式化時間字串(完整的格式化引數),這裡是"11/28/08"
os.clock() <== 返回執行該程式CPU花去的時鐘秒數,這裡是1156.726
函式data,不管它的名字是什麼,其實是time函式的一種“反函式”。它將一個表示日期和時間的數值,轉換成更高階的表現形式。其第一個引數是一個格式化字串,描述了要返回的時間形式。第二個引數就是時間的數字表示,預設為當前的時間。使用格式字元 "*t",建立一個時間表。例如下面這段程式碼:
temp = os.date("*t", 906000490)
則會產生表
{year = 1998, month = 9, day = 16, yday = 259, wday = 4,
hour = 23, min = 48, sec = 10, isdst = false}
不難發現該表中除了使用到了在上述時間表中的區域以外,這個表還提供了星期(wday,星期天為1)和一年中的第幾天(yday,一月一日為1)除了使用 "*t" 格式字串外,如果使用帶標記(見下表)的特殊字串,os.data函式會將相應的標記位以時間資訊進行填充,得到一個包含時間的字串。(這些特殊標記都是以 "%" 和一個字母的形式出現)如下:
print(os.date("today is %A, in %B"))
--> today is Tuesday, in May
print(os.date("%x", 906000490))
--> 09/16/1998
這些時間輸出的字串表示是經過本地化的。所以如果是在巴西(葡萄牙語系),"%B" 得到的就是 "setembro"(譯者按:大概是葡萄牙語九月?),"%x" 得到的就是 "16/09/98"(月日次序不同)。標記的意義和顯示例項總結如下表。例項的時間是在1998年九月16日,星期三,23:48:10。返回值為數字形式的還列出了它們的範圍。(都是按照英語系的顯示描述的,也比較簡單,就不煩了)
%a |
abbreviated weekday name (e.g., Wed) |
%A |
full weekday name (e.g., Wednesday) |
%b |
abbreviated month name (e.g., Sep) |
%B |
full month name (e.g., September) |
%c |
date and time (e.g., 09/16/98 23:48:10) |
%d |
day of the month (16) [01-31] |
%H |
hour, using a 24-hour clock (23) [00-23] |
%I |
hour, using a 12-hour clock (11) [01-12] |
%M |
minute (48) [00-59] |
%m |
month (09) [01-12] |
%p |
either "am" or "pm" (pm) |
%S |
second (10) [00-61] |
%w |
weekday (3) [0-6 = Sunday-Saturday] |
%x |
date (e.g., 09/16/98) |
%X |
time (e.g., 23:48:10) |
%Y |
full year (1998) |
%y |
two-digit year (98) [00-99] |
%% |
the character '%' |
事實上如果不使用任何引數就呼叫date,就是以%c的形式輸出。這樣就是得到經過格式化的完整時間資訊。還要注意%x、%X和%c由所在地區和計算機系統的改變會發生變化。如果該字串要確定下來(例如確定為mm/dd/yyyy),可以使用明確的字串格式方式(例如"%m/%d/%Y")。
函式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))