资料摘自《Lua程序设计(第二版)》
在Lua中,函数time和date提供了所有的日期和时间功能。
如果不带任何参数调用time函数,它会以数字形式返回当前的日期和时间。如果用一个table作为参数调用它,它会返回一个数字,表示该table中所描述的日期和时间。这种table具有以下有效字段:
year 一个完整的年份
month 01~12
day 01~31
hour 00~23
min 00~59
sec 00~59
isdst 一个布尔值,true表示夏令时
前三个字段是必须要有的,其它字段默认为中午(12:00:00)。在里约热内卢运行的一个UNIX系统上,可以写这样一个示例:
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})) -->5400
其中,10800是3个小时的秒数,5400则是10800加上12小时的秒数。
函数date是time的一个反函数,它可以将一个表示日期和时间的数字转换成某些高级的表现形式。其第一个参数是格式字符串,指定了期望的表示形式;第二个参数是日期和时间的数字,默认当前日期和时间。
为了生成一个日期table,可以使用格式字符串"*t"。例如,调用os.date("*t",906000490)会返回下面这个table:
{year=1998,month=9,day=16,yday=259,wday=4,hour=23,min=48,sec=10,isdst=false}
注意,除了用于os.time的那些字段之外,os.date所创建的table中还包含了星期数(wday,1表示星期天)和一年中的第几天(yday,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 一星期中天数的简写(例如:Wed)
%A 一星期中天数的全称(例如:Wednesday)
%b 月份的简写(例如:Sep)
%B 月份的全称(例如:September)
%c 日期和时间(例如:09/16/98 23:48:10)
%d 一个月中的第几天(16)[01~32]
%H 24小时制中的小时数(23)[00~23]
%I 12小时制中的小时数(11)[01~12]
%j 一年中的第几天(259)[001~366]
%M 分钟数(48)[00~59]
%m 月份数(09[01~12]
%p "上午(am)"或"下午(pm)"
%S 秒数(10)[00~59]
%w 一星期中第几天(3)[0~6=星期天~星期六]
%x 日期(例如:09/16/98)
%X 时间(例如:23:48:10)
%y 两位数的年份(98)[00~99]
%Y 完整的年份(1998)
%% 字符'%'
如果不带任何参数调用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))