[gelöst] Wie die Tage jetzt ohne Komma ?

Begonnen von TomLee, 24 August 2019, 15:31:52

Vorheriges Thema - Nächstes Thema

TomLee

nextWastedays {
my $var =fhem('get Kalender events timeFormat:"%Y-%m-%d %H:%M:%S" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
$substr/86400}


Hallo,

an dem Punkt weiß ich jetzt nicht wie ich es weiter angehen soll das ich eine Ganzzahl erhalte. Mir als Laien fallen nur 2 Möglichkeiten ein:
Runden ginge, mag ich aber nicht.
Bei $var die Zeit durch Nullen ersetzen und schauen wie ich aus time() oder sonstwie Heute 00:00 Uhr bekomme.
Kann man das so machen ?
Kann jemand einen kleinen Tipp geben in welche Richtung es jetzt geht ?

Gruß

Thomas

Thomas

Otto123

#1
Hallo Thomas,

du meinst sowas? Also einfach den ganzzahligen Anteil? Die Tage der Vorfreude ohne Bruchteile?  ;D
{int((time_str2num("2019-09-04 00:00:00")-time())/86400)}
also
{
my $var =fhem('get Kalender events timeFormat:"%Y-%m-%d %H:%M:%S" format:custom="$T1" limit:count=1');
int((time_str2num($var)-time())/86400)
}


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Glaub nicht, jetzt aber keine Zeit mehr.

In time_str2num($var) steht doch dann nicht 2019-09-04 00:00:00 sondern bspw. bei Startzeitpunkt 06:00 Uhr 2019-09-04 06:00:00

int() mein ich so verstanden zu haben das dann ohne die Komma (Hundertstel oder was das sind) beim UNIX-Timestamp gerechnet wird.

Otto123

Naja deine Formel liefert die Zeit in Tagen bis zum Event den Du ausliest (ob da jetzt 6:00 oder 00:00 drin steht hängt ja vom Event ab)
Du bekommst also als Ergebnis 10,2 Tage willst aber nur 10 Tage wissen. So wie man das auch sagen würde: es sind noch 10 Tage bis zum Geburtstag.
int() ermittelt einfach den Ganzzahl Anteil von 10,2 ob das jetzt Tage sekunden oder Euro sind ist int() völlig egal.

Ansonsten musst Du Deine Frage nochmal formulieren in dem Du neben Dich trittst :) ich habe es mehrfach lesen müssen um halbwegs eine Idee zu bekommen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#4
Zitat von: Otto123 am 24 August 2019, 17:59:49
Du bekommst also als Ergebnis 10,2 Tage willst aber nur 10 Tage wissen. So wie man das auch sagen würde: es sind noch 10 Tage bis zum Geburtstag.
int() ermittelt einfach den Ganzzahl Anteil von 10,2 ob das jetzt Tage sekunden oder Euro sind ist int() völlig egal.

Das hat mich jetzt schonmal weiter gebracht.

int((time_str2num($var)-time())/86400)

Ist nix anderes (denk ich, bringt nämlich einen HASH... Fehler) wie

my $substr = time_str2num($var) - time();
return int($substr/86400);


Mein Fehler war bloß das ich es so versucht hatte.

return int($substr)/86400;


Die Lösung kommt aber dem Runden gleich, nachdem ich versucht habe neben mich zu treten.

An deinem Beispiel mit 2019-09-04 sind es für mich Heute bis 24 Uhr 11 Tage und keine 10 Tage.

Daher mein Gedanke nicht mit Jetzt also time() sondern (glaube jetzt gelesen zu haben man macht es mit localtimetimelocal()) mit -noch keine Ahnung wie- 2019-08-24 00:00:00 und nicht mit der vorgegeben Startzeit von  $T1 2019-09-04 00:06:00 aus dem Kalender sondern ersetzt diese vor dem rechnen mit 2019-09-04 00:00:00.

Damit wäre immer mit vollen 24 Stunden gerechnet und ich erhoffe mir bis 24 Uhr eine 11.








TomLee

#5
Ups, Denkfehler.

{(timelocal(0, 0, 0, 4, 9, 2019) - timelocal(0, 0, 0, 24, 8, 2019))/86400}
10


und eine Angabe von 24 bei Stunden out of range 0...23

Otto123

Moin,

int() hat mit runden nichts zu tun. Wenn Bei Dir 11 und bei mir 10 rauskommt kann es nur daran liegen, dass Du in einer anderen Zeitzone wohnst :)

Versuch ein paar low Level Beispiele:
{int(10.8)}
{int(10.2)}


Jetzt liefert mir mein fixes Beispiel
{int((time_str2num("2019-09-04 00:00:00")-time())/86400)}übrigens 9 :)
und (es ist 11:14:00)
{int((time_str2num("2019-09-04 11:16:00")-time())/86400)}
wieder 10 :)
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

ZitatMoin,

int() hat mit runden nichts zu tun. Wenn Bei Dir 11 und bei mir 10 rauskommt kann es nur daran liegen, dass Du in einer anderen Zeitzone wohnst 

Ich sagte ich erwarte eine 11 und hatte aber nachdem ich die Syntax von timelocal verstanden hatte mit

{(timelocal(0, 0, 0, 4, 9, 2019) - timelocal(0, 0, 0, 24, 8, 2019))/86400}

erfahren dürfen das ich einen Denkfehler hatte.

ZitatJetzt liefert mir mein fixes Beispiel

Code: [Auswählen]

{int((time_str2num("2019-09-04 00:00:00")-time())/86400)}übrigens 9 
und (es ist 11:14:00) 

Code: [Auswählen]

{int((time_str2num("2019-09-04 11:16:00")-time())/86400)}wieder 10 
Gruß Otto

Das ist auch klar die 10 hast du aber nur noch zwei Minuten bis 11:16 dann wirds wieder eine 9 und ich will bis 24 Uhr eine 10.

Das ist das was ich meinte mit

ZitatDamit wäre immer mit vollen 24 Stunden gerechnet und ich erhoffe mir bis 24 Uhr eine 11.

Nach einer Nacht drüber schlafen wäre das auch umsetzbar in dem man den Startzeitpunkt (nur zum rechnen) auf 24 Uhr stellt/ersetzt:

{((time_str2num("2019-09-04 24:00:00") - timelocal(0, 0, 0, 24, 8, 2019))/86400}




Mag sein das ich hier mit 10 oder 11 einfach auch auf dem Holzweg bin.
Mein Gedanke war, miete ich bspw. einen Raum oder ein Hotelzimmer von 24.08.2019 bis 04.09.2019, dann zahle ich 11 Tagesmieten und nicht 10.





Otto123

#8
ZitatMein Gedanke war, miete ich bspw. einen Raum oder ein Hotelzimmer von 24.08.2019 bis 04.09.2019, dann zahle ich 11 Tagesmieten und nicht 10.

Der Satz trägt jetzt mal bei mir dazu bei, zu verstehen was Du willst  :D
Ich hatte alle Deine Einwände quasi anders herum verstanden :)

Du willst quasi ungeachtet der wirklich Event "Tageszeit" einfach Tage betrachten? Dann lies doch einfach auch nur den Tag aus dem Event und den Tag von heute und setze die Zeit auf 00:00:00 oder irgendwas anderes (Zimmer im Hotel gelten ja meist von 14:00 bis 11:00)
Heutiger Tag:
{strftime('%F',localtime(time))}
Beim Kalender analog:
get Kalender events timeFormat:"%F" format:custom="$T1" limit:count=1

Denn dies hier sind doch wieder zwei unterschiedliche Dinge!  :o
Dein letztes Beispiel im direkten Vergleich:
{(time_str2num("2019-09-04 00:00:00")-time_str2num("2019-08-24 00:00:00"))/86400}
{(time_str2num("2019-09-04 24:00:00")-timelocal(0, 0, 0, 24, 8, 2019))/86400}

Man muss dabei beachten:
Die von timelocal zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.
timelocal für gestern ist also timelocal(0, 0, 0, 24, 7, 2019) und nicht timelocal(0, 0, 0, 24, 8, 2019) !!!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

HaHa,

bald hab ichs:

ZitatnextWastedays {
my $var =fhem('get Google_Abfallkalender events timeFormat:"%Y-%m-%d 24:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
return int($substr/86400)
}

ergibt 3.


ZitatnextWastedays {
my $var =fhem('get Google_Abfallkalender events timeFormat:"%Y-%m-%d 00:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
return int($substr/86400)
}

ergibt 2.


eigentlich und das verstehe ich noch nicht und muss das int mal rausnehmen um genau zu verstehen was gerechnet wird, möchte/muß ich doch (auch wenns noch klappt) aber nicht time() also Jetzt verwenden sondern timelocal(0, 0, 0, 25, 8, 2019)

nextWastedays {
my $var =fhem('get Google_Abfallkalender events timeFormat:"%Y-%m-%d 24:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - timelocal(0, 0, 0, 25, 8, 2019);
return int($substr/86400);

}



ergibt plötzlich aber -27.

Otto123

Zitat von: TomLee am 25 August 2019, 13:38:40
ergibt plötzlich aber -27.
Du hast meinen Post in der aktuelle Version noch nicht gelesen!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

JaJaJa,

sry hatte den letzten Beitrag nicht gelesen, so langsam versteh ich auch und muss es jetzt erstmal verarbeiten. :)


ZitatDie von timelocal zurückgegebene Monatsangabe hat die Ganzzahlwerte 0 bis 11 für Januar bis Dezember.
timelocal für gestern ist also timelocal(0, 0, 0, 24, 7, 2019) und nicht timelocal(0, 0, 0, 24, 8, 2019) !!!

Und da ist ja auch die Antwort auf die letzte Frage, irgendwann wär ich auch selbst drauf gekommen  ;D

Otto123

Der hier ist übrigens gut: timeFormat:'%F 08:00:00'
Nach sowas einfachen hatte ich gesucht, danke dafür!

Der geht dann auch hier:{strftime('%F 11:00:00',localtime(time))}

%F ist die Kurzform für %Y-%m-%d  8)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Bin noch am verarbeiten ;), aber Danke schon mal für die Unterstützung, sehe schon das das jetzt was wird.

ZitatDann lies doch einfach auch nur den Tag aus dem Event und den Tag von heute und setze die Zeit auf 00:00:00 oder irgendwas anderes

Hatte ich doch gleich im ersten Post gefragt ob man das so macht/machen kann. ;D

Zitat von: TomLee am 24 August 2019, 15:31:52
nextWastedays {
my $var =fhem('get Kalender events timeFormat:"%Y-%m-%d %H:%M:%S" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time();
$substr/86400}


Mir als Laien fallen nur 2 Möglichkeiten ein:

Bei $var die Zeit durch Nullen ersetzen und schauen wie ich aus time() oder sonstwie Heute 00:00 Uhr bekomme.
Kann man das so machen ?

TomLee

#14
nextWastedays {
my $var =fhem('get Kalender events timeFormat:"%F 24:00:00" format:custom="$T1" limit:count=1');
my $substr = time_str2num($var) - time_str2num(strftime('%F 00:00:00',localtime(time)));
return int($substr/86400);
}


Sieht so bis jetzt gut aus.  :P



ZitatBei $var die Zeit durch Nullen ersetzen und schauen wie ich aus time() oder sonstwie Heute 00:00 Uhr bekomme.
Kann man das so machen ?


Damit war genau das gemeint :

Zitat{strftime('%F 11:00:00',localtime(time))}


DANKE