Variablenprofil ~UnixTimestampTime fehlerhaft bei Sommerzeit

Hallo zusammen…

Hoffe bin hier richtig mit meinem Problem und habs nirgends übersehen :wink:

Ich wollte gerade eine Laufzeit für eine Pumpe programmieren, dazu hätte ich gerne das Variablenprofil ~UnixTimestampTime verwendet.

Jetzt ist mir aufgefallen, sobald ich bei der Variable den Wert 1 (also 1 Sekunde) schreibe, sehe ich in der Spalte Wert folgendes „01:00:01“
Denke mal es liegt jetzt gerade an der Sommerzeit, habe die Zeitzone mal testweise auf London gestellt und da passts.
Es betrifft übrigens auch das Profil ~UnixTimestamp

Habs bei 4.1 und bei 4.2 getestet -> bei beiden gleiches Verhalten.

LG,
Christian.

Das ist korrekt. Der UnixTimeStamp ist in GMT gespeichert und nicht in der lokalen Zeit.

paresy

ok, wenns kein Fehler ist, dann werd ichs anders umgehen :wink:

vielen Dank.

lg,
Christian.

Hallo Christian,

du kannst da sehr wohl das Profil ~UnixTimeStampTime benutzen. Du musst allerdings verstehen, dass die Umrechnung der abgespeicherten Zahl manuell etwas komplizierter wäre. Aber dafür gibt es glücklicherweise in PHP ein paar Hilfsfunktionen.
Zum einen gibt es mktime um die Variablen zu initialisieren. Wenn wir nur bei Uhrzeiten bleiben, kannst mktime mit drei Argumenten aufrufen, also beispielsweise:

$time = mktime(1,30,0);

Das würde in der Variable $time die Uhrzeit 1:30:00 abspeichern bzw. 1 Stunde, 30 Minuten und 0 Sekunden, wenn du es als Dauer siehst.

Da du ja aber mit den Zahlen auch arbeiten möchtest, musst du sie auch wieder aus dem Zeitstempel auslesen. Dafür benutzt du die Funktion date. So kannst du beispielsweise mit


	$hour = date("G", $time);
	$minute = date("i", $time);
	$second = date("s", $time);

die Stunden, Minuten und Sekunden des Zeitstempels auslesen und weiter verwenden.

So kannst du in den vollen Genuss des Profils kommen und musst dich nicht mit so etwas wie Sommerzeit oder Zeitzonen rumplagen.

Viele Grüße
Niels

Hi!

Ich muss das Thema hier nochmal aufgreifen…

Ich habe für ein Modul 2 Variablen, über welche man eine Zeitspanne (von X bis Y) einstellen kann. Also z.B. von 19:00 bis 7:00 Uhr.
Da ich an das Gerät die Werte als String (HH:SS) übergeben muss, habe ich mir Funktionen zur Umrechnung geschrieben.

Funktioniert soweit alles wunderbar…aber:
>> Lese ich die Werte vom Gerät aus, rechne das in Integer-Sekunden um und schreibe es in die Variable, dann steht da z.B. „20:00“ statt den eigentlichen „19:00“ - obwohl die Sekunden stimmen.
>> Setze ich den Wert übers WebFront auf „20:00“ Uhr, dann wird ans Gerät "19:00"übertragen.

Ich könnte ja theoretisch die eine Stunde immer einberechnen, aber das ist ja nur bei Sommerzeit der Fall, wenn ich das richtig verstanden habe…?!

Wie kann ich das Variablenprofil „~UnixTimestampTime“ zur Einstellung der Stunden verwenden? Ich würde ungern einfach eine TextBox verwenden mit einem String.

Irgendwie erschließt sich mir die Logik hier nicht, warum Symcon da intern noch etwas dran drehen muss. Wenn ich 19:00 einstelle, dann will ich auch den Wert in Sekunden in der Variable haben und nicht den Wert „mit Umrechnung“…

Danke im Voraus und Grüße,
Chris

Du musst als Grundlage immer UTC nutzen, mit lokaler Zeit rechnet niemand. UTC will auch IPS haben und ein Unix Timestamp ist auch immer UTC.
Wenn dein Geräte die Zeit in lokaler Zeit haben will, muss du selber umrechnen.
Funktionen dazu bietet PHP genug.
Michael

Ich will nur, dass der User einfach „19:00“ im WebFront auswählen kann und in der Integer-Variable erwarte ich dann 68400 Sekunden - und nicht wenn ich 20:00 im WebFront auswähle, dass ich dann 68400 in der Variable stehen habe :confused: :confused:

Ich brauche die Sekunden eigentlich gar nicht - muss die Integer Variable aber ja verwenden, damit ich dem User die Möglichkeit geben will über „~UnixTimestampTime“ die Stunden und Minuten einstellen zu lassen - statt über eine TextBox mit einem String.

Irgendwo fehlt mir wohl ein Puzzleteil, um den Sinn zu verstehen :confused:

-Chris-

Der Name vom Profil ist Programm.
UnixTimestamp!
Das ist der Sekundenwert in UTC!
Michael

Ich verstehe nur Bahnhof. Für mich sind 19 Stunden genau 68400 Sekunden. Nichts mit UTC oder GMT. Finde das an der Stelle Banane.

Egal, ich lasse das und baue eine TextBox ein…2 Stunden für so einen Schmarn vertrödelt…

Trotzdem Danke!
-Chris-

UnixTimestamp ist in UTC kodiert. Nutz bei der Weitergabe einfach immer die date(„H:i:s“, $timestamp) Funktion und dann kommt auch genau das heraus, was du erwartest. Und beim Erstellen einfach mktime verwenden.

paresy

Habe das Modul eben nochmal auf Integer-Variablen mit ~UnixTimestampTime umgebaut (Code neu geschrieben)…und wie ich meine genauso wie vorhin - aber irgendwas hab ich vorhin wohl anders/falsch gemacht. Denn jetzt spucken meine Funktionen genau das aus was sie sollen und auch im/übers WebFront stimmt/funktioniert alles.

Damit nicht noch jemand sich so doof anstellt wie ich vorhin (was auch immer der Fehler war), hier der Code dazu:

<?

$timeInt = TimeConvert_HoursMinutes_to_Seconds('19:00');
echo "Zeit in Sekunden = ".$timeInt.PHP_EOL;

$timeString = TimeConvert_Seconds_to_HoursMinutes($timeInt);
echo "Zeit als String = ".$timeString.PHP_EOL;


function TimeConvert_HoursMinutes_to_Seconds($timeString)
{
    return strtotime('01.01.1970 '.$timeString);
}

function TimeConvert_Seconds_to_HoursMinutes($seconds)
{
    return date('H:i', $seconds);
}

Grüße,
Chris

Hallo Chris,

Du könntest auch stattdessen die PHP Funktion strtotime nehmen.

Also:

$timeString = strtotime('19:00');

Gruß Burkhard

Hi Burkhard!

Theoretisch ja :slight_smile: Aber dann würde am heutigen Tage in der Integer-Variable stehen: 1551636000
…statt 64800 Sekunden für 19 Stunden :wink:

Und ja, ich bin manchmal etwas komisch :smiley:

Viele Grüße,
Chris

Achso, dann könntest du dem strtotime ja noch den 1.1.1970 hinzufügen, das hatte ich übersehen[emoji1]

Aber es gibt natürlich viele Wege[emoji1]

Args, du hast natürlich recht! Ich denke oft einfach zu kompliziert :rolleyes: :smiley:

Hab es in meinem Post mit den Funktionen geändert - ist ja doch einfacher/schöner so :slight_smile:

Danke!
-Chris-

Ich stand heute vor ähnlichen Verständnisproblemen, da der Wertebereich von -3600 bis 82799 bei MEZ zu Störungen im Skriptablauf führte.

Das ist mein Lösungsansatz:


$current_time   = localtime(time(),true);
$timepoint      = localtime(GetValueInteger($objectID,true);

$timepoint      = $timepoint['tm_hour']*3600+$timepoint['tm_min']*60+$timepoint['tm_sec'];
$timepoint      = $timepoint % 86400;
$current_time   = $current_time['tm_hour']*3600+$current_time['tm_min']*60+$current_time['tm_sec'];

Die zusätzlichen „% 86400“ waren notwendig da meine Zeiteingabe Werte > 86400 zurücklieferte.

Somit kann ich beide Werte jetzt vergleichen und für eine zeitliche Steuerung nutzen, da beide Werte zwischen 0 und 86399 sind.

Gruß

Henning