第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但还是有一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


22.1 – 日期和时间

两个函数,timedate,执行 Lua 中的所有日期和时间查询。

time 函数在不带参数调用时,会返回当前日期和时间,编码为一个数字。(在大多数系统中,该数字是自某个历元以来的秒数。)当使用一个表调用时,它会返回表示该表所述日期和时间的数字。此类日期表具有以下重要字段

year一个完整的年份
month01-12
day01-31
hour00-23
min00-59
sec00-59
isdst一个布尔值,如果采用夏令时,则为 true

前三个字段是强制性的;其他字段在未提供时默认为中午(12:00:00)。在运行于里约热内卢(格林尼治时间以西三小时)的 Unix 系统(历元为 1970 年 1 月 1 日 00:00:00 UTC)中,我们有以下示例

    -- 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 日(星期三)23: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))