如何在lua中将时间格式化为秒?



所以基本上我很困惑,我如何使它,以便我可以转换DD:HH:MM:SS只有秒,同时考虑到数字的数量。(对不起,如果我没有任何意义,你应该知道我下面的例子是什么意思。)

print("05:00":FormatToSeconds()) -- 5 minutes and 0 seconds
-- 300
print("10:30:15":FormatToSeconds()) -- 10 hours, 30 minutes and 15 seconds
-- 37815
print("1:00:00:00":FormatToSeconds()) -- 1 day
-- 86400
print("10:00:00:30":FormatToSeconds()) -- 10 days, 30 seconds
-- 864030

等等。我想也许使用gmatch会起作用,但仍然没有。非常感谢你的帮助。

编辑:

所以我试着用gmatch来做,但我不知道这是否是最快的方法(可能不是),所以任何帮助仍然会很感激。

(代码)
function ConvertTimeToSeconds(Time)
local Thingy = {}
local TimeInSeconds = 0

for v in string.gmatch(Time, "%d+") do
if tonumber(string.sub(v, 1, 1)) == 0 then
table.insert(Thingy, tonumber(string.sub(v, 2, 2)))
else
table.insert(Thingy, tonumber(v))
end
end

if #Thingy == 1 then
TimeInSeconds = TimeInSeconds + Thingy[1]
elseif #Thingy == 2 then
TimeInSeconds = TimeInSeconds + (Thingy[1] * 60) + Thingy[2]
elseif #Thingy == 3 then
TimeInSeconds = TimeInSeconds + (Thingy[1] * 60 * 60) + (Thingy[2] * 60) + Thingy[3]
elseif #Thingy == 4 then
TimeInSeconds = TimeInSeconds + (Thingy[1] * 24 * 60 * 60) + (Thingy[2] * 60 * 60) + (Thingy[3] * 60) + Thingy[4]
end

return TimeInSeconds
end
print(ConvertTimeToSeconds("1:00:00:00"))

在进行任何实际测量之前不要担心执行速度,除非您正在设计一个时间紧迫的程序。在任何极端情况下,你都可能希望将有风险的部分卸载给C模块。

你的方法很好。有些部分你可以清理:你可以返回计算结果,因为TimeInSeconds在你的情况下实际上不作为累加器;tonumber可以很好地处理'00',并且可以使用参数确保十进制整数(从5.3开始)。

我要用另一种方式来描述表格中的因素:

local Factors = {1, 60, 60 * 60, 60 * 60 * 24}
local
function ConvertTimeToSeconds(Time)
local Components = {}
for v in string.gmatch(Time, "%d+") do
table.insert(Components, 1, tonumber(v, 10))
end
if #Components > #Factors then
error("unexpected time component")
end
local TimeInSeconds = 0
for i, v in ipairs(Components) do
TimeInSeconds = TimeInSeconds + v * Factors[i]
end
return TimeInSeconds
end

当然,两个实现都有模式为naïve的问题,因为它将匹配例如'00 what 10 ever 10'。为了解决这个问题,你可以走另一条路线,使用string.match,例如,'(%d+):(%d+):(%d+):(%d+)'和强制严格的格式,或匹配每个可能的变体。

否则,您可以使用LPeg来解析持续时间。

另一种方法是不在内部使用字符串,而是将它们转换成像{secs=10, mins=1, hours=10, days=1}这样的表,然后使用这些表——从这种表示中获取秒将是直接的。

相关内容

  • 没有找到相关文章

最新更新