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秒),说明当前时区是东八区(北京时间)
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章