os.date ([format [, time]])
返回一个包含日期及时刻的字符串或表。 格式化方法取决于所给字符串 format。
如果提供了 time 参数, 格式化这个时间 (这个值的含义参见 os.time 函数)。 否则,date 格式化当前时间。
如果 format 以 ‘!’ 打头, 日期以协调世界时格式化。 在这个可选字符项之后, 如果 format 为字符串 “*t”, date 返回有后续域的表: year (四位数字),month (1–12),day (1–31), hour (0–23),min (0–59),sec (0–61), wday (星期几,星期天为 1 ), yday (当年的第几天), 以及 isdst (夏令时标记,一个布尔量)。 对于最后一个域,如果该信息不提供的话就不存在。
如果 format 并非 “*t”, date 以字符串形式返回, 格式化方法遵循 ISO C 函数 strftime 的规则。
如果不传参数调用, date 返回一个合理的日期时间串, 格式取决于宿主程序以及当前的区域设置 (即,os.date() 等价于 os.date(“%c”))。
在非 POSIX 系统上, 由于这个函数依赖 C 函数 gmtime 和 localtime, 它可能并非线程安全的。
local date = os.date("!*t")
print("----------->", date.year, date.month, date.day)
缺陷
这个方法,每次都会返回一个新的table
改进
我希望能提供另一种用法,就像下面的代码一样
local date = {}
os.datenew(date)
print("----------->", date.year, date.month, date.day)
是否构造新的table,由我的业务逻辑去决定,比如如果是在update这么频繁调用的地方,那么我就不希望每次都构造新的table
实现方法
//loslib.c
//static int os_date (lua_State *L) { 上面添加如下代码
static int os_datenew (lua_State *L) {
time_t t = luaL_opt(L, l_checktime, 2, time(NULL));
struct tm tmr, *stm;
stm = l_localtime(&t, &tmr);
if (stm == NULL) /* invalid date? */
return luaL_error(L, "time result cannot be represented in this installation");
luaL_checktype(L, 1, LUA_TTABLE);
lua_settop(L, 1); /* make sure table is at the top */
setallfields(L, stm);
return 0;
}
//找到
//static const luaL_Reg syslib[] = {
//添加 {"os_datenew", os_datenew},
//重新编译lua