FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: gestein am 30 Dezember 2023, 20:43:49

Titel: Datum/Zeit ISO 8601 auf lokale Zeit umrechnen?
Beitrag von: gestein am 30 Dezember 2023, 20:43:49
Hallo,

Über fhempy kann ich den gestrigen Tagesverbrauch von meinem Stromanbieter holen.
Allerdings ist Datum/Uhrzeit nach ISO 8601 codiert, für gestern steht da also "2023-12-28T23:00:00.000Z".

Meinem Verständnis nach würde das für Wien bedeuten: 2023-12-29 00:00:00 (UTC+1)

Ich verstehe aber nicht, wie ich das in perl richtig umrechnen soll.
Probiert habe ich z.B.
{strftime("%Y-%m-%dT%H:%M:%S", localtime(time_str2num("2023-12-27T23:00:00.000Z")))}Aber da wird anscheinend die Zeitzone nicht berücksichtigt.

Kann mir da bitte jemand helfen?
Wie macht man das richtig?

Danke, lg, Gerhard

Titel: Aw: Datum/Zeit ISO 8601 auf lokale Zeit umrechnen?
Beitrag von: gestein am 31 Dezember 2023, 13:26:01
Nach längerem Suchen habe ich nun doch noch eine Lösung gefunden.
https://stackoverflow.com/questions/63485237/utc-to-local-time-conversion-using-perl-minimal-installed-modules/63490770#63490770

Da ich die Routine aber in einem DOIF verwenden wollte, musste ich folgendes ändern (oder man lagert es in die myUtils aus):
parse {[Event vom diVerbrauchEVU];
use POSIX qw(strftime);

::Log 1, "diVerbrauchEVU; hole den neuen Tageswert von gestern";
  my $myDate=ReadingsVal("myConsumptionEVU","consumptionYesterday_date","0");

  my ($sec, $min, $hour, $mday, $mon, $year) = reverse(split /\D/,$myDate,6);
  my $time = timegm($sec, $min, $hour, $mday, ($mon-1), $year);

    $myDate= strftime "%Y-%m-%d %T", localtime($time);
    fhem("setreading $SELF " .$myDate." consumption".ReadingsVal("myConsumptionEVU","consumptionYesterday_value","0"));
}


Ich weiß nicht, ob das eine wirklich gute Lösung ist, aber es funktioniert.
Verwendet man ein ,,use ..." in einer Funktion?

Und ich musste das ,,((reverse(split /\D/,$utc))[0..5])" auf ,,reverse(split /\D/,$utc,6)" ändern, da ansonsten DOIF das ,,[0..5]" misinterpret und einen Fehler liefert.


Lg, Gerhard