Получение разницы времени в Lua

[ lua  qlua  ]

Разница двух отметок времени.

Часто при работе с временем требуется вывести разницу двух отметок времени в виде Часы:Минуты:Секунды, например для таймера. Сама по себе разница в секундах получается просто:

os.time(t2) - os.time(t1)

или

os.difftime(os.time(t2), os.time(t1))

где t1 и t2 - это время, представленное в табличном виде, например {year=2005, month=11, day=6, hour=22, min=18, sec=30}

При этом os.difftime - вернет в большинстве систем тот же результат.

Но как представить эту разницу в виде “ЧЧ:MM:СЕК”, например организовать вывод запущенного таймера.

Можно написать функцию такого вида:

---@param intialTime string
---@param finalTime string
local function GetTimeDifference(intialTime,finalTime)

    local initialHour=tonumber(string_sub(intialTime,1,2)) *3600
    local initialMinute=tonumber(string_sub(intialTime,4,5))*60
    local initialSecond=tonumber(string_sub(intialTime,7,8))

    local finalHour=tonumber(string_sub(finalTime,1,2))*3600
    local finalMinute=tonumber(string_sub(finalTime,4,5))*60
    local finalSecond=tonumber(string_sub(finalTime,7,8))

    local totalInitialTime=initialHour+initialMinute+initialSecond
    local totalFinalTime=finalHour+finalMinute+finalSecond
    local duration=totalFinalTime-totalInitialTime

    local formatedDuration
    if(duration<10) then
        formatedDuration="00:00:0"..duration
    elseif(duration>9 and duration<60) then
        formatedDuration="00:00:"..duration
    elseif(duration>59 and duration<=3600 ) then
        --minutes handler
        local intermediateCalc=(duration/60)
        local i,j=string_find(tostring(intermediateCalc),"%.")
        if(i==nil and j==nil) then
        formatedDuration="00:0"..intermediateCalc
        else
            local min=string_sub(tostring(intermediateCalc),1,i-1)
            if(tonumber(min)<10) then
            formatedDuration="00:0"..min
            else
            formatedDuration="00:"..min
        end
        end

        local newSeconds=duration%60
        if(newSeconds<10) then
            formatedDuration=formatedDuration..":0"
                    ..newSeconds
        else
            formatedDuration=formatedDuration..":"
                ..newSeconds
        end
    else
        --hour handler

        local newMinutes=(finalMinute-initialMinute)/60
        if(newMinutes<0) then
        newMinutes=newMinutes*-1
        end
        newMinutes = math_floor(newMinutes)

        if(newMinutes<10) then
            newMinutes="0"..newMinutes
        end

        local newSeconds=(finalSecond-initialSecond)
        if(newSeconds<0) then
        newSeconds=newSeconds*-1
        end
        newSeconds = math_floor(newSeconds)

        if(newSeconds<10) then
            newSeconds="0"..newSeconds
        end

        formatedDuration=math_floor((finalHour-initialHour)/3600)
        ..":"..newMinutes..":"..newSeconds
    end
    return formatedDuration
end

На вход подаются две отметки времени в виде строки. Такая функция необходима если у нас нет времени в числовом или табличном виде.

Если же у нас есть просто разница в секундах, то можно воспользоваться той же os.date.

Вспомним, что начало времен в UNIX вселенной это:

os.date(‘%d.%m.%Y %H:%M:%S’, 0) = 01.01.1970 03:00:00

Нам надо сдвинуть время на начало суток, т.е. на 21 час, т.е. на 75600 секунд.

os.date(‘%d.%m.%Y %H:%M:%S’, 75600) = 02.01.1970 00:00:00

А далее все просто. Например, если разница между отметками времени составляет 5000 секунд, то:

os.date(‘%H:%M:%S’, 75600 + 5000) = 01:23:20

т.е. 1 час 23 минуты и 20 секунд.

Т.о. чтобы получить представление разницы в секундах необходимо получить представление времени формата “%H:%M:%S” для числа (75600 + time_diff). Где 75600 - это сдвиг на 21 час на начало суток.