总结一下最近造成误会的地方,关于时间和时间戳转换的使用和关于lua保留指定小数位数,
首先是时间转换。
-- 转换成时间 【xxx小时xxx分xxx秒】 单位秒
function TimeUtil:FormatTimeString(time)
if time and time >= 0 then
local tb = { }
tb.day = math.floor(time / 60 / 60 / 24)
tb.hour = math.floor(time / 3600) % 24
tb.min = math.floor(time / 60) % 60
tb.sec = math.floor(time % 60)
return tb
end
end
这种适用于计算时差,然后做倒计时用。
---FormatTimeSpanToDate
---@param timeSpan number 10位的时间戳
function TimeUtil:FormatTimeSpanToDate(timeSpan)
if timeSpan and timeSpan >= 0 then
local tb = { }
tb.year = tonumber(os.date("%Y",timeSpan))
tb.mon =tonumber(os.date("%m",timeSpan))
tb.day = tonumber(os.date("%d",timeSpan))
tb.hour = tonumber(os.date("%H",timeSpan))
tb.min = tonumber(os.date("%M",timeSpan))
tb.sec = tonumber(os.date("%S",timeSpan))
return tb
end
end
这种是时间戳转成年月日,适用显示日期
--时间戳格式化
os.date("%Y-%m-%d %H:%M:%S", os.time())
--2022-02-11 16:22:24
os.date("%m月%d日%H:%M:%S", os.time())
--02月11日16:22:24
os.date("%Y%m%d%H%M%S",os.time())
--20220211162224
关于lua保留指定小数
--lua原本提供的保留n位小数的方法。此方法的误区在于保留时遵循四舍五入的原则。
--即 0.111显示为 0.11, 0.116显示为 0.12
string.format("%.2f", num)
以上保留方案适用于大部分问题解决方案。但在我们所做的战力数据的展示页面会出现这样的问题,在特殊情况下会出现不同模块战力相加大于总战力数据,这样就比较容易被误会。
于是需要一种向下取值的方案。即截取对应位数的数据即可。
--- 截取指定位数的数据
--- nNum 源数字
--- n 小数位数
function GameUtil:CustomFormatNum(nNum, n)
if type(nNum) ~= "number" then
return nNum
end
n = n or 0
n = math.floor(n)
if n < 0 then
n = 0
end
local nDecimal = 10 ^ n
local nTemp = math.floor(nNum * nDecimal)
local nRet = nTemp / nDecimal
return nRet
end
以上。