所以基本上我很困惑,我如何使它,以便我可以转换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}
这样的表,然后使用这些表——从这种表示中获取秒将是直接的。