Autor Thema: UTC in local time umrechnen?  (Gelesen 1741 mal)

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
UTC in local time umrechnen?
« am: 08 August 2022, 19:09:16 »
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

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18517
Antw:UTC in local time umrechnen?
« Antwort #1 am: 08 August 2022, 19:28:12 »
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
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:UTC in local time umrechnen?
« Antwort #2 am: 08 August 2022, 21:15:51 »
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

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9971
Antw:UTC in local time umrechnen?
« Antwort #3 am: 08 August 2022, 21:28:07 »
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

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18517
Antw:UTC in local time umrechnen?
« Antwort #4 am: 08 August 2022, 21:38:59 »
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?
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18517
Antw:UTC in local time umrechnen?
« Antwort #5 am: 08 August 2022, 21:48:09 »
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);
}
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:UTC in local time umrechnen?
« Antwort #6 am: 08 August 2022, 22:01:36 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:UTC in local time umrechnen?
« Antwort #7 am: 08 August 2022, 22:34:44 »
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

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9971
Antw:UTC in local time umrechnen?
« Antwort #8 am: 08 August 2022, 23:00:27 »
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