UTC in local time umrechnen?

Begonnen von gestein, 08 August 2022, 19:09:16

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

Ich habe den ganzen Nachmittag damit verbracht, einen Zeitstring in UTC in die lokale Zeit umzurechnen - hab's aber leider nicht geschafft.
Die ganzen Beispiele im Netz verwenden alle unterschiedliche Ansätze und ich bringe unter FHEM keinen zum Funktionieren.
Kann mir hier bitte jemand helfen?

Die Zeitstrings sehen so aus:
2022-08-08T17:00:00Z

Wie bekomme ich davon die lokale Zeit?
Danke im Voraus
Lg, Gerhard

betateilchen


sub test {
  my $utc = '2022-08-08T17:20:00Z';
  my ($sec, $min, $hour, $mday, $mon, $year) = ((reverse(split /\D/,$utc))[0..5]);
  my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);
  Debug strftime "%Y-%m-%dT%T UTC", gmtime($time);
  Debug strftime "%Y-%m-%dT%T %Z %z", localtime($time);
}


liefert als Ergebnis (im Logfile)


2022.08.08 19:26:50 1: DEBUG>2022-08-08T17:20:00 UTC
2022.08.08 19:26:50 1: DEBUG>2022-08-08T19:20:00 CEST +0200
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gestein

Hallo Betateilchen,

Danke. Das Beispiel hatte ich auch gefunden und probiert.

Ich wollte es in einem DOIF verwenden, da steigt dann DOIF aus.

Bei folgendem Test-DOIF kommt dann eine Fehlermeldung (yrno ist das Device von Dir für yr.no):
defmod diyrno DOIF {#https://stackoverflow.com/questions/63485237/utc-to-local-time-conversion-using-perl-minimal-installed-modules\
# if([yrno:&API_LAST_MSG] == 200) {\
\
    for(my $i=0;; $i <= 6;; $i++) {\
      my $utc=ReadingsVal("yrno","properties.timeseries.$i.time","");;\
      my ($sec, $min, $hour, $mday, $mon, $year) = ((reverse(split /\D/,$utc))[0..5]);;\
      my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);;\
  set_Reading("test_$i",localtime($time));;\
    }\
  }\
}


Folgende Fehlermeldung kommt dann:
condition c01: syntax error at (eval 9271854) line 6, near ")::InternalDoIf"
Global symbol "$mon" requires explicit package name (did you forget to declare "my $mon"?) at (eval 9271854) line 7.
Unmatched right curly bracket at (eval 9271854) line 10, at end of line
syntax error at (eval 9271854) line 10, near "}
  }"


Und je mehr ich herumbastle, desto eigenartiger werden die Meldungen.
Gut zu wissen, dass das eigentlich funktionieren sollte.
Dann frage ich mal im DOIF-Bereich.

Lg, Gerhard

Damian

Was schon mal auffällt, du hast zwei öffnende geschweifte Klammen und drei schließende (if hast du ja auskommentiert)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

Zitat von: gestein am 08 August 2022, 21:15:51
Ich wollte es in einem DOIF verwenden, da steigt dann DOIF aus.
Bei folgendem Test-DOIF kommt dann eine Fehlermeldung (yrno ist das Device von Dir für yr.no):

Du kannst die ganze Umrechnung und Formatierung doch direkt im yrno device machen, dafür gibt es doch entsprechende Attribute in JsonMod.
Wozu brauchst Du da noch ein DOIF?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: betateilchen am 08 August 2022, 21:38:59
Du kannst die ganze Umrechnung und Formatierung doch direkt im yrno device machen, dafür gibt es doch entsprechende Attribute in JsonMod.


defmod yrno JsonMod https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=48.14&lon=16.21
attr yrno readingList single(test(jsonPath('properties.timeseries.0.time')),'time_converted','n/a')


test() ist eine Funktion in der 99_myUtils.pm in der die Konvertierung vorgenommen wird.


sub test {
  my $utc = shift;
  my ($sec, $min, $hour, $mday, $mon, $year) = ((reverse(split /\D/,$utc))[0..5]);
  my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);
  return strftime "%Y-%m-%dT%T %Z %z", localtime($time);
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gestein

Danke für die Hinweise.
Da hatte ich wohl Tomaten auf den Augen.

Das DOIF wollte ich nehmen, da ich mich damit etwas auskenne und mit JSONMOD aber überhaupt nicht.
Außerdem dachte ich, dass ich mit DOIF flexibler bin beim Umrechnen und Formatieren.
Das werde ich mir aber dann doch mal anschauen.

Lg, Gerhard

gestein

Wenn ich im DOIF eine ,,}" wegnehme, dann kommt bei mir die folgende Fehlermeldung:
condition c01: syntax error at (eval 9380392) line 6, near ")::InternalDoIf"
Global symbol "$mon" requires explicit package name (did you forget to declare "my $mon"?) at (eval 9380392) line 7.


Und wenn ich $mon umbenenne, dann kommt beim Ausführen von Block 1 die Fehlermeldung:
condition c01: syntax error,::InternalDoIf"
Und das Warning:
condition c01: (Missing operator before ::InternalDoIf?)

Also werde ich versuchen die Funktion so wie Du in eine sub auslagern.

Lg, Gerhard

Damian

Das Problem ist die Angabe [1..5] im DOIF-Block, diese wird als Trigger interpretiert.

Wenn du es mit DOIF machen willst, dann würde ich die test-Routine im subs-Block definierten und sie dann im DOIF-Block nutzen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF