lua 時間函數os.time()和os.date()

os.date##

  • 原型:os.date ([format [, time]])
  • 解釋:返回一個按format格式化日期、時間的字串或表。

usage##

  • 參數格式:
  • 由原型可以看出可以省略第二個參數也可以省略兩個參數,只省略第二個參數函數會使用當前時間作爲第二個參數,如果兩個參數都省略則按當前系統的設置返回格式化的字符串,做以下等價替換 os.date() <=> os.date("%c")。
  • 如果format以“!”開頭,則按格林尼治時間進行格式化。
  • 如果format是一個“*t”,將返一個帶year(4位),month(1-12), day (1--31), hour (0-23), min (0-59),sec (0-61),wday (星期幾, 星期天爲1), yday (年內天數)和isdst (是否爲日光節約時間true/false)的帶鍵名的表;
  • 如果format不是“*t”,os.date會將日期格式化爲一個字符串,具體如下:
格式符 含義 具體示例
%a 一星期中天數的簡寫 (Fri)
%A 一星期中天數的全稱 (Wednesday)
%b 月份的簡寫 (Sep)
%B 月份的全稱 (May)
%c 日期和時間 (09/16/98 23:48:10)
%d 一個月中的第幾天 (28)[0 - 31]
%H 24小時制中的小時數 (18)[00 - 23]
%I 12小時制中的小時數 (10)[01 - 12]
%j 一年中的第幾天 (209)[01 - 366]
%M 分鐘數 (48)[00 - 59]
%m 月份數 (09)[01 - 12]
%P 上午或下午 (pm)[am - pm]
%S 一分鐘之內秒數 (10)[00 - 59]
%w 一星期中的第幾天 (3)[0 - 6 = 星期天 - 星期六]
%W 一年中的第幾個星期 (2)0 - 52
%x 日期 (09/16/98)
%X 時間 (23:48:10)
%y 兩位數的年份 (16)[00 - 99]
%Y 完整的年份 (2016)
%% 字符串'%' (%)
  • 新建一個文件命名爲datetest.lua編寫如下代碼:
print ("os.date example:\n")
print ("format = \"*t\" result:\n")
local timetable = os.date("*t", os.time());   -->os.date用法
for i, v in pairs(timetable) do
      print(i, v);
end

print ("\nformat start with \"!\" result:\n")
local utimetable = os.date("!*t", os.time()); -->os.date用法
for i, v in pairs(utimetable) do
      print(i, v);
end

print ("\nother format result:\n")
print(os.date("today is %c, in %A"))         -->os.date用法
print(os.date("1060004s is %x", 1060004))
  • 運行結果

date.png

總結#

  • 注意format "!" 的用法,因爲我們的時間(北京)處於東8區,所以兩次的結果會差8個小時,從結果中可以看出。
  • 注意使用format "*t"返回的table中wday如果是1表示星期天,而使用通用格式時%w用0表示星期天。

Lua標準庫中提供了關於時間函數 os.time()和os.date(),這兩個函數需要注意的地方就是加入了時區的概念

 

os.time() 得到是當前時間的距離1970.1.1.08:00時間的秒數,如果傳入的參數小於這個時間,那麼就會得到一個,秒數就是負數,會得到一個空值

 

os.time()

1.  不傳參的話返回當前時間轉化成秒數的結果

local time2 = os.time()   

2.  傳參返回指定時間轉化秒數的結果

local time = os.time({year =2016, month = 11, day =23, hour =17, min =17, sec = 00})

print(“====================time=,”,time)  -- 結果打印   1479892620

 

tips:任何一個時區,在相同的時間,同時調用os.time() 返回的結果都是一樣的

 

os.date() 把時間戳轉化成可顯示的時間字符串

1.  dump(os.date(“*t”,0),“--->”)      -- 格式化成表的形式顯示

result:

"--->" = {

    "day"   = 1      --日

     "hour"  = 8     --小時

     "isdst" =false     --是否夏令時

     "min"   = 0     --分鐘

     "month" = 1     --月

     "sec"   = 0     --秒

     "wday"  = 5     --星期5

     "yday"  = 1     --當年已過天數

     "year"  = 1970  --年

 }

2.print("===============os.date()==",os.date("%Y-%m-%d%H:%M:%S",1479892620))

Result:

===============os.date()==   2016-11-23﹎17:17:00

 

tips:如果服務器返回一個時間戳,客戶端想要轉換成可讀樣式,需要考慮到時區問題,因爲是按照本地時區轉換的,如果本地時區跟服務器所在時區不一致,就會導致時間顯示錯誤,一般解決辦法就是 加上時區差即可。ps:如果有夏令時,則需要加上3600s

 

但是怎麼獲取時區呢?

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