Datum/Zeit ISO 8601 auf lokale Zeit umrechnen?

Begonnen von gestein, 30 Dezember 2023, 20:43:49

Vorheriges Thema - Nächstes Thema

gestein

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


gestein

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