Hallo rudi,
ich bekomme hin und wieder folgende Warnung im log:
PERL WARNING: Argument "56Z" isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line 21.
Ich vermute die Ursache im stateFormat eines JsonMod Devices:
POSIX::strftime("%d.%m.%y",localtime(time_str2num(ReadingsVal($name,"published_at","2000-01-01T00:00:00Z"))));
Das Reading:
2020-04-24 14:06:00 published_at 2020-03-26T17:48:56Z
Da ich nur %d.%m.%y benötige, sehe ich auch keinen Fehler.
Ist dies ein zu fixender bug oder ein feature und das Reading ist malformed?
(Oder ist meine Code-Zeile zur Datumswert-Umwandlung zu komplex?)
Danke vorab.
Rudi ich habe Zeile 20 wie folgt positiv getestet
@a = split("[ZT: -]", $str);
Grüße
time_str2num ist nicht fuers Parsen von Zeitangaben mit TimeZone gedacht, und das wird sie durch erweitern der split mit Z auch nicht.
Wen man vorhat das zu unterstuetzen, muesste man die TimeZone Angabe mktime weitergeben, aber laut "perldoc POSIX" nimmt die perl Variante von mktime keine solchen Parameter, im Gegensatz zu der C-Variante, siehe "man mktime". Laut Internet-Weisheit sollte man fuer sowas das externe DateTime Modul verwenden, dieses Modul ist mir aber sehr unsympathisch.
Ich wuerde das vorliegende Problem durch Stringmanipulation loesen, selbst wenn damit die Zeitzone auch ignoriert wird.
Ich staune gerade auch ueber die (Fremd-)Erweiterung der time_str2num Funktion vor 7 Jahren fuer den Fall dass kein $str spezifiziert ist.
Das habe ich jetzt korrigiert.
Danke. Fürs Analysieren, Erklären und partiell fixen/optimieren.
Zitat von: rudolfkoenig am 24 April 2020, 16:36:32
Ich wuerde das vorliegende Problem durch Stringmanipulation loesen, selbst wenn damit die Zeitzone auch ignoriert wird.
Also in meinem Fall sowas wie:
my $pubat = substr(ReadingsVal($name,"published_at","2000-01-01T00:00:00Z"),0,-1);
$ret .= POSIX::strftime("%d.%m.%y",localtime(time_str2num($pubat)));
Ich meinte eher sowas wie
ReadingsVal($name,"published_at","2000-01-01T00:00:00Z") =~ m/^20(\d+)-(\d+)-(\d+)/;
$ret .= "$3.$2.$1";
aber ich habe es nicht getestet, und ich bestehe auch nicht auf diese Art der Loesung.
Zitat von: rudolfkoenig am 24 April 2020, 16:49:17
Ich meinte eher sowas wie
ReadingsVal($name,"published_at","2000-01-01T00:00:00Z") =~ m/^20(\d+)-(\d+)-(\d+)/;
$ret .= "$3.$2.$1";
aber ich habe es nicht getestet, und ich bestehe auch nicht auf diese Art der Loesung.
Hab ich aber getestet und sieht erstmal gut aus. Die Frage ist, welche die bessere, elegantere, Ressourcen-schonendere Lösung ist!? Vermutlich deine....
Haengt davon ab, wen man fragt :)