Zeitdifferenz berechnen via LUA

Hallo Zusammen,

ich möchte die Zeitdifferenz zwischen zwei Datumswerten berechnen. Die Differenz soll in Stunden ausgeben werden, auch über mehrere Tage hinweg. Bsp. 2 Tage = 48h. Das Ganze soll als Funktion verfügbar sein, dass ich es in mehreren Scripten wiederverwenden kann.

Meine Lösung: Ich nehme im ersten Schritt zwei Datumswerte und berechne über eine Funktion (toTimestamp) den Datumswert in Epochensekunden. Im zweiten Schritte berechne ich die Differenz der beiden Werte über eine weitere Funktion (timeDifference).

Leider kommt aber beim Delta immer ein falscher Wert raus. Sieht jemand den Fehler und kann helfen. Nach meinem Verständnis müsste die Deltaberechnung eigentlich tun.

Danke,
Oliver

--[[
%% properties
%% events
%% globals
--]]

-- VARIABLES

local sleep = "07-09-2019 23:00"
local awake = "08-09-2019 7:00"

-- FUNCTIONS

-- from hour:min to unixtime
local function toTimestamp(time)
  currentDate = os.date("*t");
  hours, minutes = time:match("^(%d+):(%d+)")
  return os.time({ year=currentDate.year, month=currentDate.month, day=currentDate.day, hour=hours, min=minutes })
end

-- from Human Date (day-month-year hour:min) to Timestamp
local function toDatestamp(date)
	d, m, y, h, mi = date:match("^(%d+)-(%d+)-(%d+)%s+(%d+):(%d+)")
  	fibaro:debug( y.. '-' ..m.. '-' ..d.. ' ' ..h.. ':' ..mi );
  	return os.time({ year=y, month=m, day=d, hour=h, min=mi })
end

-- from unixtime to hour:min
local function toHumanDate(unixtime)
  currentDate = (os.date('%d-%m-%Y %H:%M:%S', unixtime))
  return currentDate;
end

-- Function to calculate Delta between times
local function timeDifference(time1, time2)
  timeDelta = (time2-time1); -- Minus 60min 
  fibaro:debug("Time Difference (unix): " ..timeDelta);
  timeDifference = (os.date('%H:%M', timeDelta))
  --timeDifference = (os.date('%X', timeDelta))
  return timeDifference;
end

-- CODE

local awakeTime = tonumber(toDatestamp(awake));
fibaro:debug("Awake Time (unix): "..awakeTime)
fibaro:debug("Awake Time (Human): "..toHumanDate(awakeTime))

local sleepTime = tonumber(toDatestamp(sleep));
fibaro:debug("Sleep Time (unix): "..sleepTime)
fibaro:debug("Sleep Time (Human): "..toHumanDate(sleepTime))

fibaro:debug("Time Difference: "..timeDifference(sleepTime, awakeTime))

Schon fündig geworden? Es gibt eine os.difftime Funktion die Du mal probieren könntest.

Danke Andy, aber die Funktion macht ja eigentlich nichts anderes als time2-time1 aus zugeben.
Ich habe das jetzt anders gelöst. Ich rechne die Uhrzeit in Sekunden um und berechne dann das Delta. Hierfür habe ich eine Funktion gebaut. Der folgende Code funktioniert jetzt.

--[[
%% properties
%% events
%% globals
--]]

-- VARIABLES

local sleep = "12-09-2019 23:00"
local awake = "13-09-2019 07:00"

-- FUNCTIONS

--  Converts a time-value string to number of seconds
local function str2sec(str) 
  local h,mi,s=str:match("(%d%d):(%d%d):?(%d*)") 
  return 3600*h+60*mi+(s~="" and s or 0) 
end

-- Converts back to time-value string
function sec2str(sec) 
  local fmt = string.format
  return fmt("%02d:%02d%s",math.floor(sec/3600),math.floor((sec % 3600)/60),sec % 60 > 0 and fmt(":%02d",sec%60) or "") 
end

-- Calculates time between sleeptime and awaketime
local function timeDifference(awake, sleep)
	local secondsAwake = str2sec(awake);
	fibaro:debug("Seconds Awake: "..secondsAwake);

	local secondsSleep = str2sec(sleep);
	fibaro:debug("Seconds Sleep: "..secondsSleep);

	local secondsDiff = 0;
	
  	-- calculate seconds before or after midnight
	if (secondsAwake >= secondsSleep) then
  		secondsDiff = (secondsAwake-secondsSleep);
  		else 
  		 	local midNight = 86400; --24:00 o'clock = 86400sec
  			fibaro:debug("Seconds Mid Night: "..midNight);
  			secondsDiff = (secondsAwake)+(midNight-secondsSleep);
	end
	local finalDiff = sec2str(secondsDiff);
	return finalDiff
end  

-- CODE
fibaro:debug("Time Difference is: "..timeDifference(awake,sleep));