如何在 lua 中给日期时间添加分钟和秒钟?

我有一个 lua 函数试图将当前播放歌曲的时间长度(例如hh:mm:ss)转换为秒。

function toSeconds (inputstr)
    local mytable = string.gmatch(inputstr, "([^"..":".."]+)");

    local conversion = { 60, 60, 24}
    local seconds = 0;
    --iterate backwards
    local count = 0;

    for i=1, v in mytable do
        count = i+1
    end

    for i=1, v in mytable do
        mytable[count-i]
        seconds = seconds + v*conversion[i]
    end
    return seconds
end

为了将其添加到 os.time 中,以获取歌曲的预计结束时间。

但是小时可能缺失,或者短时间内可能缺少分钟。

运行 https://www.lua.org/cgi-bin/demo 中的测试脚本时, 我只得到了 input:10: 'do' expected near 'in'

function toSeconds (inputstr)
    local mytable = string.gmatch(inputstr, "([^"..":".."]+)");

    local conversion = { 60, 60, 24}
    local seconds = 0;
    --iterate backwards
    local count = 0;

    for i=1, v in mytable do
        count = i+1
    end

    for i=1, v in mytable do
        mytable[count-i]
        seconds = seconds + v*conversion[i]
    end
    return seconds
end

print(toSeconds("1:1:1")
点赞
用户4984564
用户4984564

你混淆了两种写for循环的方式:

a)

for i=1,10 do
   print(i, "This loop is for counting up (or down) a number")
end

b)

for key, value in ipairs({"hello", "world"}) do
   print(key, value, "This loop is for using an iterator function")
end

可以看到,第一个循环仅仅是计数器,这里是 i。第二个循环比较通用,可以对几乎任何东西进行迭代(例如使用 io.lines),但是经常与 pairsipairs 一起用于遍历表格。

你还不能写 for ... in tab,其中 tab 是一个表格;必须使用 ipairs,它返回表格的迭代器(一个函数)。


你也在错误地使用 string.gmatch。它不返回表格,而是一个迭代器函数,用于在字符串中匹配模式的匹配项,因此你可以像这样使用它:

local matches = {}
for word in some_string:gmatch("[^ ]") do
   table.insert(matches, word)
end

这将给你一个包含匹配项的实际表格,但是如果你只是要遍历表格,那么最好直接使用 gmatch 循环。


for i=1, v in mytable do
   count = i+1
end

我认为你只是试图统计表格中的元素?你可以使用 # 运算符轻松获取表格的长度,因此 #mytable


如果你有一个像 hh:mm:ss 的字符串,但是小时和分钟可以缺失,最简单的方法可能是将它们填充为 0。一种有点短小精悍但有些不正规的方法是将 "00:00:" 附加到字符串末尾,然后在其中查找最后3个数字:

local hours, minutes, seconds = ("00:00:"..inputstr):match("(%d%d):(%d%d):(%d%d)$")

如果没有缺失,最终将得到类似于 00:00:hh:mm:ss 的东西,你只需获取最后3个值即可得到正确的时间。

2020-02-03 07:13:44