docfred
Geocacher
Hallo zusammen,
das Zeitproblem auf den unterschiedlichen Geräten UTC vs. MEZ/MESZ hat mir keine Ruhe gelassen. Deshalb habe ich jetzt eine Routine geschrieben, die basierend auf die UTC-Zeit ( os.date("!*t") ) die korrekte Zeit errechnet.
Der erste Teil berechnet, an welchen Tagen MESZ gilt und an welchen nicht. Der zweite Teil korrigiert auf MEZ oder MESZ.
Die Formel berechnet auch die Verschiebung auf den neuen Tag/neuen Monat/neuesJahr, wenn kurz vor Mitternacht, wenn notwendig.
Ich habe es im Emulator und unter Android mit verschiedenen Daten (Datums) getestet und es scheint zu funktionieren.
Alle die Interesse haben, bitte die Funktion ausgiebig zu testen. Die Funktion liefert eine table zurück, (wie os.date("*t") ). Zusätzlich gibts noch das Flag .leapyear und den String .zone. Das Flag .isdst wird auch befüllt.
Bitte um Rückmeldung, wenn was nicht richtig funktioniert.
docfred
URWIGO-File ist im Anhang.
das Zeitproblem auf den unterschiedlichen Geräten UTC vs. MEZ/MESZ hat mir keine Ruhe gelassen. Deshalb habe ich jetzt eine Routine geschrieben, die basierend auf die UTC-Zeit ( os.date("!*t") ) die korrekte Zeit errechnet.
Der erste Teil berechnet, an welchen Tagen MESZ gilt und an welchen nicht. Der zweite Teil korrigiert auf MEZ oder MESZ.
Die Formel berechnet auch die Verschiebung auf den neuen Tag/neuen Monat/neuesJahr, wenn kurz vor Mitternacht, wenn notwendig.
Ich habe es im Emulator und unter Android mit verschiedenen Daten (Datums) getestet und es scheint zu funktionieren.
Alle die Interesse haben, bitte die Funktion ausgiebig zu testen. Die Funktion liefert eine table zurück, (wie os.date("*t") ). Zusätzlich gibts noch das Flag .leapyear und den String .zone. Das Flag .isdst wird auch befüllt.
Code:
function correct_time()
local time = os.date("!*t")
local max_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
if time.year /4 == math.floor(time.year /4) then
max_month[2] = 29
time.leapyear = true
else
time.leapyear = false
end
--Ermitteln ob SZ
if time.month < 3 or time.month > 10 then -- Monate ohne SZ
time.isdst = false
elseif time.month > 3 and time.month < 10 then -- Monate mit SZ
time.isdst = true
elseif time.month == 3 then
if (time.day - time.wday) < 24 then
time.isdst = false
else
if time.wday == 1 and time.hour < 2 then -- Sonntag und vor 2Uhr
time.isdst = false
else
time.isdst = true
end
end
elseif time.month == 10 then
if (time.day - time.wday) < 24 then
time.isdst = true
else
if time.wday == 1 and time.hour < 2 then --Am Schalttag vor 2 Uhr
time.isdst = true
else
time.isdst = false
end
end
end
-- Neues Datum berechnen
print(time.isdst)
time.hour = time.hour + 1 -- +1 für UTC+1
if time.isdst == true then
time.zone = "MESZ"
time.hour = time.hour + 1 -- +1 für Sommerzeit
else
time.zone = "MEZ"
end
if time.hour > 23 then --Neuer Tag
time.hour = time.hour -24
time.day = time.day + 1
time.wday = time.wday +1
if time.wday == 8 then
time.wday = 1
end
if time.day > max_month[time.month] then -- Neuer Monat
time.day = 1
time.month = time.month +1
if time.month > 12 then -- Neues Jahr
time.month = 1
time.year = time.year +1
end
end
end
return time -- Liefert einen table zurück wie os.date. zusätzlich noch time.leapyear und time.zone
end
Bitte um Rückmeldung, wenn was nicht richtig funktioniert.
docfred
URWIGO-File ist im Anhang.