Zeitangaben, rechnen mit: Unterschied zwischen den Versionen

Aus FHEMWiki
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 9: Zeile 9:
* Umwandeln der Zahl in eine Zeichenkette (Formatierung)
* Umwandeln der Zahl in eine Zeichenkette (Formatierung)


=== Umwandeln eine Zeichenkette in eine Zahl ===
=== Umwandeln eine Zeichenkette in eine Zahl === {{Randnotiz|RNTyp=Info|RNText= Hinweis!
* Die von <code>timelocal</code> zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.}}
Hier hängt das Verfahren von der Struktur der Zeichenkette ab.
Hier hängt das Verfahren von der Struktur der Zeichenkette ab.


Zeile 20: Zeile 21:
   time_str2num(ReadingsTimestamp(<devicename>, <reading>,<defaultvalue>))
   time_str2num(ReadingsTimestamp(<devicename>, <reading>,<defaultvalue>))


=== Umwandeln einer Zahl in eine Zeichenkette ===
=== Umwandeln einer Zahl in eine Zeichenkette === {{Randnotiz|RNTyp=Info|RNText= Hinweis!
* Die von <code>localtime</code> als Parameter erwartete Monatsangabe muss im Bereich der Ganzzahlwerte 0 bis 11 für Januar bis Dezember liegen.
* Werden keine Parameter angegeben, bezieht sich die Ausgabe auf den aktuellen Zeitpunkt.}}
Zur Umwandlung seien die folgenden Perl-Funktionen genannt:
Zur Umwandlung seien die folgenden Perl-Funktionen genannt:
* <code>"HH:MM, DD.MM.YY" =~ /(\d\d).(\d\d)..(\d\d).(\d\d).(\d\d)/</code> extrahiert HH,MM,DD,MM und YY aus der Zeichenkette HH:MM, DD.MM.YY, die ein Datum in der angegebenen Form enthält. \d steht für eine Ziffer, der Punkt für ein beliebiges Zeichen, die () schreiben den Treffer in spezielle Variablen in der Reihenfolge ihrer Anordnung HH in $1, MM in $2, DD in $3 usw.
* <code>"HH:MM, DD.MM.YY" =~ /(\d\d).(\d\d)..(\d\d).(\d\d).(\d\d)/</code> extrahiert HH,MM,DD,MM und YY aus der Zeichenkette HH:MM, DD.MM.YY, die ein Datum in der angegebenen Form enthält. \d steht für eine Ziffer, der Punkt für ein beliebiges Zeichen, die () schreiben den Treffer in spezielle Variablen in der Reihenfolge ihrer Anordnung HH in $1, MM in $2, DD in $3 usw.
Zeile 27: Zeile 30:


=== Berechnungsbeispiele ===
=== Berechnungsbeispiele ===
Die einzeiligen Beispiele sollten im Eingabefeld von FHEMWEB ausführbar sein.


==== Addition zu einem Zeitstempel ====
Gegeben sei ein [[Readings|Reading]] ''motion'' des [[Gerät|Gerätes]] ''BM1'' mit einem Zeitstempel ''2017-08-11 14:17:13''. Es sollen 2 Stunden und 12 Minuten addiert werden und das Ergebnis als HH:MM dargestellt werden.
Gegeben sei ein [[Readings|Reading]] ''motion'' des [[Gerät|Gerätes]] ''BM1'' mit einem Zeitstempel ''2017-08-11 14:17:13''. Es sollen 2 Stunden und 12 Minuten addiert werden und das Ergebnis als HH:MM dargestellt werden.


Zeile 39: Zeile 44:
   return $result;
   return $result;
}</syntaxhighlight>
}</syntaxhighlight>
==== Addition zum aktuellen Zeitpunkt ====
Zur aktuellen Zeit sollen 30 Minuten addiert und das Ergebnis als HH:MM:SS dargestellt werden.
<syntaxhighlight lang="perl">{POSIX::strftime("%H:%M:%S",localtime(time+30*60))}</syntaxhighlight>
==== Subtraktion vom aktuellen Zeitpunkt ====
Zur aktuellen Zeit sollen 45 Minuten subtrahiert und das Ergebnis als HH:MM:SS dargestellt werden.
<syntaxhighlight lang="perl">{POSIX::strftime("%H:%M:%S",localtime(time-45*60))}</syntaxhighlight>


=== Weitere Funktionen zur Zeitumwandlung ===
=== Weitere Funktionen zur Zeitumwandlung ===
Zeile 45: Zeile 60:


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
== Links ==
<references />

Version vom 23. Januar 2018, 20:17 Uhr


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


Mit leicht lesbaren Zeitangaben, wie 07:30, 23.05.2017, 09:20 usw. kann in FHEM nicht ohne Weiteres gerechnet werden, da es sich um Zeichenketten handelt und nicht um Zahlen.

Verfahren zum Rechnen mit Zeitangaben, die als Zeichenkette vorliegen

Die Berechnung erfolgt in Perl. Das Verfahren besteht aus drei Schritten:

  • Umwandeln der Zeichenketten in eine Zahl, z.B. Sekunden.
  • Berechen einer Zeit als Zahl.
  • Umwandeln der Zahl in eine Zeichenkette (Formatierung)

=== Umwandeln eine Zeichenkette in eine Zahl ===

Info green.pngHinweis!
  • Die von timelocal zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.

Hier hängt das Verfahren von der Struktur der Zeichenkette ab.

Perl und FHEM stellen Funktionen zur Umwandlung bereit.

  • time liefert die aktuelle Zeit in Sekunden, siehe [1]
  • time_str2num("YYYY-MM-DD HH:MM:SS") wandelt einen FHEM-Zeitstempel in Sekunden um, siehe [2]
  • timelocal(<Sekunden>, <Minuten>, <Stunden>, <Tag des Monats>, <Monat>, <Jahr>) wandelt einen Satz von Zeitelementen (Sekunden, Minuten, Stunden usw.) in Sekunden um, siehe [3]
  • Sekunden + Minuten * 60 + Stunden * 60 * 60 + Tage * 24 * 60 * 60 berechnen eines Summanden oder Subtrahenden aus Sekunden, Minuten, Stunden und Tagen.

Beispiel: Zeitstempel eines Readings in Sekunden umwandeln

 time_str2num(ReadingsTimestamp(<devicename>, <reading>,<defaultvalue>))

=== Umwandeln einer Zahl in eine Zeichenkette ===

Info green.pngHinweis!
  • Die von localtime als Parameter erwartete Monatsangabe muss im Bereich der Ganzzahlwerte 0 bis 11 für Januar bis Dezember liegen.
  • Werden keine Parameter angegeben, bezieht sich die Ausgabe auf den aktuellen Zeitpunkt.

Zur Umwandlung seien die folgenden Perl-Funktionen genannt:

  • "HH:MM, DD.MM.YY" =~ /(\d\d).(\d\d)..(\d\d).(\d\d).(\d\d)/ extrahiert HH,MM,DD,MM und YY aus der Zeichenkette HH:MM, DD.MM.YY, die ein Datum in der angegebenen Form enthält. \d steht für eine Ziffer, der Punkt für ein beliebiges Zeichen, die () schreiben den Treffer in spezielle Variablen in der Reihenfolge ihrer Anordnung HH in $1, MM in $2, DD in $3 usw.
  • (Sekunden, Minuten, Stunden, Tag des Monats, Monat, Jahr, Nummer des Wochentages, Tag des Jahres, Sommerzeitkennzeichen) = localtime(Zeit in Sekunden) gibt die einzelnen Zeitelemente zurück, siehe [4]
  • POSIX::strftime(<Format>,<Array mit Zeitelementen>), wandelt ein Array aus Zeitelementen, wie es localtime liefert in eine formatierte Zeichenkette um. <Format> wird mit Hilfe bestimmter Formatierungszeichen (%a für den Wochentagnamen, %d für den Tag des Monats usw. siehe [5]) festgelegt.

Berechnungsbeispiele

Die einzeiligen Beispiele sollten im Eingabefeld von FHEMWEB ausführbar sein.

Addition zu einem Zeitstempel

Gegeben sei ein Reading motion des Gerätes BM1 mit einem Zeitstempel 2017-08-11 14:17:13. Es sollen 2 Stunden und 12 Minuten addiert werden und das Ergebnis als HH:MM dargestellt werden.

{POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp("BM1","motion","2000-01-01 00:00:00"))+2*60*60+12*60))}

Schrittweise:

{
  my $timestamp = ReadingsTimestamp("BM1","motion","2000-01-01 00:00:00");
  my $seconds = time_str2num($timestamp)+2*60*60+12*60;
  my $result = POSIX::strftime("%H:%M",localtime($seconds));
  return $result;
}

Addition zum aktuellen Zeitpunkt

Zur aktuellen Zeit sollen 30 Minuten addiert und das Ergebnis als HH:MM:SS dargestellt werden.

{POSIX::strftime("%H:%M:%S",localtime(time+30*60))}

Subtraktion vom aktuellen Zeitpunkt

Zur aktuellen Zeit sollen 45 Minuten subtrahiert und das Ergebnis als HH:MM:SS dargestellt werden.

{POSIX::strftime("%H:%M:%S",localtime(time-45*60))}

Weitere Funktionen zur Zeitumwandlung

Links