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秒),說明當前時區是東八區(北京時間)
 

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