第一版是為 Lua 5.0 編寫的。雖然對後續版本來說仍然有很大的相關性,但還是有些差異。
第四版鎖定 Lua 5.3,可以在 Amazon 和其他書店買到。
購買這本書,您也同時 贊助了 Lua 專案


22.1 – 日期和時間

在 Lua 中,所有日期和時間的查詢都由兩個函式 timedate 執行。

time 函式在沒有參數的情況下呼叫時,會傳回目前的日期和時間,編碼成一個數字。(在大部分的系統中,這個數字是從某個紀元開始的秒數。)當使用一個表格呼叫時,它會傳回一個數字,表示表格中所描述的日期和時間。這種日期表格具有下列重要的欄位

year完整的年份
month01-12
01-31
hour00-23
min00-59
sec00-59
isdst布林值,如果實施夏令時間,則為 true

前三個欄位是強制性的;其他欄位在未提供時,預設為中午(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)

date 函式儘管名稱是日期,但卻有點像是 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}
請注意,除了 os.time 使用的欄位之外,os.date 所建立的表格也提供星期幾(wday,1 是星期日)和年日(yday,1 是 1 月 1 日)。

對於其他格式字串,os.date 會將日期格式化為字串,這是格式字串的複本,其中特定的標籤會被時間和日期的資訊取代。所有標籤都由 `%´ 後接一個字母表示,如下列範例

    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 年 9 月 16 日(星期三)下午 11:48:10 的值。對於數值,表格也會顯示其可能值的範圍

%a縮寫的星期名稱(例如,星期三
%A完整的星期名稱(例如,星期三
%b縮寫的月份名稱(例如,9 月
%B完整的月份名稱(例如,9 月
%c日期和時間(例如,09/16/98 23:48:10
%d日期中的天數(16)[01-31]
%H使用 24 小時制的小時(23)[00-23]
%I使用 12 小時制的小時(11)[01-12]
%M分鐘(48)[00-59]
%m月份(09)[01-12]
%p"am""pm"pm
%S秒數(10)[00-61]
%w星期(3)[0-6 = 星期日到星期六]
%x日期(例如,09/16/98
%X時間(例如,23:48:10
%Y完整的年份(1998
%y兩位數的年份(98)[00-99]
%%字元 `%´

如果您在沒有任何引數的情況下呼叫 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))