之前在項目中遇到一個問題:有個字段上游返回給我的是類似 “28800000” 這樣格式的毫秒數,可是數據來源的UI界面上顯示的卻是類似 “9:00” 這樣的格式,為了格式統一,PM 要求我能不能把我這邊的格式轉換一下。
由於這個字段是個實時數據,它沒有跟數據庫的某個表或者某個字段對應,所以要轉的話只能用Lua腳本來進行轉換。
我一開始用了os.date()函數,很容易就轉換出來了。但是編譯的時候卻報錯,好像是說找不到os.date()這個函數,有點忘了,但是反正意思就是不能使用os.date()這個函數。我查的時候貌似看到說os.date()這個函數是個內置函數,為什么不能使用呢?
既然不能使用,那我就自己寫一個吧。反正也不難。
下面是我當時在代碼中寫的,反正功能是實現了,我已經加了注釋說明。我們需要轉換成的格式只是類似 “9:00” 這樣,沒有年月日和毫秒,如果需要,加上就行。如果寫的有欠缺的,歡迎指正。
-- timestampToDate() is an function that convert timestamp format like '28800000' to date format like '9:00'
function timestampToDate(x)
if x == nil or x == "" then //先判斷要轉換的數據是否為空,如果為空,直接返回
return x
end
local n = tonumber(x) //把要轉換的數據先轉成數字類型,如果能轉成數字,就去做轉格式處理;否則直接返回
if n then
hour = (n - n%(1000*60*60) )/(1000*60*60) //小時。Java中的除法結果是整數部分,可以直接n/(1000*60*60)就行了,但是Lua的除法結果是保留小數的,所以需要先
進行n - n%(1000*60*60) ,再拿此結果去進行除法操作
minmills = n% (1000 * 60 * 60) //除去小時之后,還剩下的所有毫秒數
min = (minmills - minmills%(1000*60))/(1000*60) //分鍾。跟上面的小時的算法一樣
if min < 10 then
return hour..":0"..min //分鍾數為 0 ~ 9 需要顯示為 01, 02, 03 ... , 09 所以需要在分鍾數前面拼接一個 0
end
return hour..":"..min //分鍾數大於等於 10 時,不需要拼接 0
else
return x
end
end