Lua中的os.time和os.date以及时区计算

-----

lua函数os.time
源码见 loslib.c 中的 int os_time (lua_State *L)

lua中无参数调用:os.time()
直接返回time(NULL),即UNIX时间戳,也即UTC时间 1970-01-01 00:00:00 至今的秒数

lua中有参数调用:os.time({year=, month=, day=, hour=, ..})
将参数放入tm结构,返回mktime(tm*)。注意:mktime将参数视为本地时间,将其转成UTC时间后,返回减去UTC 1970-01-01的差值

所以,print(os.time({year=1970, month=1, day=1, hour=8})) == 0,
因为,北京时间 1970-01-01 08:00:00 == UTC时间 1970-01-01 00:00:00 == Epoch
另外,不带参数的os.time() 可认为默认参数为:当前时区的当前时间,一样说得通

-----

lua函数os.date([format [, time]])
源码见 loslib.c 中的 int os_date (lua_State *L)

如果lua调用中有第二个参数,t=time,否则t=time(NULL);这里不是关注的重点,略去不表。

当format中第一个字符为'!'
stm = l_gmtime(&t, &tmr); // l_gmtime就是gmtime_r,即 struct tm *gmtime_r(const time_t *, struct tm *)
将UNIX时间戳转换为tm结构,输出UTC时区的时间

当format中第一个字符不是'!'
stm = l_localtime(&t, &tmr); // l_gmtime就是localtime_r,即 struct tm *localtime_r(const time_t *, struct tm *)
将UNIX时间戳转换为tm结构,输出本地时区的时间

-----

计算当前时区
now = os.time()
os.difftime(now, os.time(os.date("!*t", now))) / 3600

now是当前时间戳,os.date("!*t", now)是当前时间戳对应的UTC时间,
os.time(os.date("!*t", now))是把当前UTC时间视为本地时间再计算时间戳,注意真正的转换发生在这里!
所以如果相差8个小时(8*3600秒),说明当前时区是东八区(北京时间)
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值