Lua日期函数的优化版本

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值