Zeit berechnen zwischen Sonnenauf und -untergang

Begonnen von Hi2Helmi, 09 März 2019, 08:15:34

Vorheriges Thema - Nächstes Thema

Hi2Helmi

Hallo,
ich berechne in einem DOIF die Zeitdauer von Sonnenaufgang bis Sonnenuntergang mit
{if ([03:00]) {use Date::Parse;set_State(POSIX::strftime("%H:%M",localtime((str2time(::sunset_abs())-str2time(::sunrise_abs())))))}}
Als Ergebnis bekomme ich aber 13:29 an dem heutigen Tage müsste aber 12:29 herauskommen!
Ich habe schon nachgeschaut mit
{str2time(::sunset_abs())} bekomme ich 1552153718
{str2time(::sunrise_abs())} bekomme ich 1552108738
Die Rechnung ist also 1552153718 - 1552108738 = 44980
Diese Zahl umgerechnet ist 12:29:40

Wo wird die Stunde dazugerechnet?
MfG
Florian

Otto123

Hi,

bei localtime :)
Du kannst gmtime nehmen.
{strftime("%H:%M",gmtime(str2time(sunset_abs())-str2time(sunrise_abs())))}

Er schlägt dir sonst die Stunde drauf. Ich bin mir aber nicht mal sicher, ob das mit gmtime immer so richtig ist?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Hi2Helmi

Das funktioniert. Mal sehen was es im Sommer macht mit der Sommerzeit!
MfG
Florian

Groby

#3
Hi,

wenn Dir die Berechnung später am Tag reicht, kannst Du auch "sunset_rel()" bei Sonnenaufgang nehmen.

Das liefert die aktuelle Zeit bis Sonnenuntergang.

MfGroby

Otto123

Sollte passen
Zitatgmtime, gmtime_r - convert a time value to a broken-down UTC time
UTC ist ok, ich hatte irgendwie Bedenken es handelt sich um GMT.
Bei UTC spielt normalerweise DST (Sommerzeit) keine Rolle.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Martin98

Hi!

Das Problem, das du beschreibst, liegt sehr wahrscheinlich an der Zeitzone oder Sommerzeit. Dein Ergebnis 13:29 ist genau eine Stunde zu viel, während die reine Differenz der Unix-Timestamps (44980 Sekunden) korrekt 12:29:40 ergibt.

Wenn du zwischendurch überprüfen willst, ob deine Berechnung stimmt, kannst du auch einen Online Zeitrechner nutzen.
. Dort kannst du Start- und Endzeit als Unix-Timestamps oder normale Uhrzeiten eingeben und siehst sofort die exakte Differenz in Stunden, Minuten und Sekunden.

Der Fehler entsteht durch die Verwendung von localtime() zusammen mit strftime("%H:%M"). localtime() gibt die Zeit in lokaler Zeitzone aus, also inklusive Sommerzeit, während die Differenz der Timestamps schon die echte Dauer in Sekunden ist. Wenn du die Differenz direkt in strftime übergibst, interpretiert es die Sekunden als Datum seit Epoch (1970) in deiner Zeitzone – daher kommt die Stunde zu viel.

Lösung:

Statt localtime() direkt zu nutzen, solltest du die Sekunden einfach in Stunden, Minuten und Sekunden umrechnen:

my $diff = str2time(::sunset_abs()) - str2time(::sunrise_abs());
my $hours = int($diff / 3600);
my $minutes = int(($diff % 3600) / 60);
my $seconds = $diff % 60;
sprintf("%02d:%02d", $hours, $minutes);


Damit bekommst du die korrekte Dauer unabhängig von Zeitzone oder Sommerzeit.

So siehst du direkt, dass deine Dauer wirklich 12:29:40 beträgt.