Получение разницы времени в 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 час на начало суток.