Как я могу добавить минуты и секунды к дате в lua? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть функция lua, чтобы попытаться преобразовать длительность текущей воспроизводимой песни, например, чч: мм: сс, в секунды.

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")

1 Ответ

2 голосов
/ 03 февраля 2020

Вы смешиваете два возможных способа записи: for l oop:

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 в данном случае. Второй очень обобщенный c и может использоваться для итерации почти всего (например, с использованием io.lines), но чаще всего используется с pairs и ipairs для итерации по таблицам.

Вы также не пишете for ... in tab, где tab - таблица; вы должны использовать ipairs для этого, который затем возвращает итератор для таблицы (которая является функцией)


Вы также неправильно используете string.gmatch; он не возвращает таблицу, но выполняет функцию итератора для совпадений шаблона в строке, поэтому вы можете использовать его следующим образом:

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

, который дает вам фактическую таблицу, содержащую совпадения, но если вы собираетесь перебирать только эту таблицу, вы можете использовать gmatch l oop напрямую.


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

Я думаю, вы просто пытаетесь подсчитать элементы в таблице здесь? Вы можете легко получить длину таблицы с помощью оператора #, поэтому #mytable


Если у вас есть строка типа hh:mm:ss, но часы и минуты могут отсутствовать, проще всего было бы просто заполнить их нулями. Несколько хакерский, но короткий способ добиться этого - просто добавить "00:00:" к вашей строке и найти в ней последние 3 цифры:

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

Если ничего не пропущено, у вас получится что-то вроде 00:00:hh:mm:ss, для которого вы берете только последние 3 значения, чтобы получить правильное время.

...