Seite 1 von 1

Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 8. Feb 2021 15:45
von joernsch
Hallo zusammen,

in OH3 möchte ich innerhalb einer rule (ausgelöst durch einen Trigger) die Tage bestimmen, die seit einem bestimmten (selbst gewähltem Datum) vergangen sind. Das Ergebnis wird per Direktnachricht dann versandt, das Versenden von Nachrichten klappt problemlos, nur finde ich nicht den richtigen Weg um die vergangenen Tage zu berechnen und bitte hier um Hilfe.
Der grundlegende Code sieht so aus:

Code: Alles auswählen

rule "Vergangene Tage berechnen"

when
	//Trigger
then
	//Berechnung der vergangenen Tage, bspw. seit dem 10.10.2020
	
	val telegramAction = getActions("telegram","telegram:telegramBot:bot0910")
    	telegramAction.sendTelegram("Tage vergangen: "+ /*Ergebnisausgabe*/)
end
Trigger ist kein Problem, den habe ich über einen Testswitch realisiert. Lediglich die Berechnung der Tage bereitet mir Kopfzerbrechen :? :? :?
Vielen Dank für jede Hilfe!

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 8. Feb 2021 16:12
von int5749
Schau doch mal hier, ob dies hilft => Days between Dates

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 8. Feb 2021 16:18
von udo1toni
In OH3 gibt es kein Joda Time mehr, sondern java.time.
Du suchst nach einer Länge (im Sinne von Dauer), also einer Duration. Die passende Funktion dürfte dann between sein.
Leider habe ich mich noch nicht weiter mit dem Thema beschäftigt, so dass ich Dir auch nicht genau sagen kann, wie die Funktion aufzurufen ist, aber es dürfte etwas in dieser Richtung sein:

Code: Alles auswählen

val Duration d = Duration.between(zeit1,zeit2)
wobei zeit1 und zeit2 natürlich gültige javatime Zeitstempel sein müssen - in welcher Form auch immer. Falls sich der Typ der beiden Zeitstempel unterscheidet, wird der zweite Zeitstempel vor dem Vergleich in den gleichen Typ gewandelt wie der erste Zeitstempel-
Duration dürfte in Sekunden zurückgegeben werden, muss dann also noch durch 86400 geteilt werden, um auf volle Tage zu kommen. Die beiden Zeitstempel enthalten auch die Uhrzeit, das muss man natürlich bei der Berechnung beachten (beispielsweise, indem man jeweils Mitternacht als Zeitpunkt nimmt).

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 8. Feb 2021 20:13
von Anbeku
Um in Anlehnung auf udo1tonis Lösung direkt auf die Anzahl der Tage zu kommen sollte folgendes funktionieren:

Code: Alles auswählen

val long days = Duration.between(zeit1,zeit2).toDays()

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 10. Dez 2021 23:21
von Ansgar
Hallo zusammen
Gibt es zu diesem Thema irgendwo eine gute Einführung?
Mir ist z.b. nicht klar, wie ein java Zeitstempel auszusehen hat!?

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 11. Dez 2021 12:12
von peter-pan
Ansgar hat geschrieben: 10. Dez 2021 23:21 Mir ist z.b. nicht klar, wie ein java Zeitstempel auszusehen hat!?
Eigentlich verstehe ich das jetzt auch nicht ganz, aber ich bin auch eher der Frager.

Aus meiner Sicht ist ein Zeitstempel "Datum und/oder Uhrzeit" zu einem bestimmten Zeitpunkt. Die einfachste Form ist "now()":

Code: Alles auswählen

var vJetzt = now()
        logInfo("Jetzt", "Jetzt ist es {}", vJetzt)
oder

Code: Alles auswählen

var vJetzt1 = LocalDateTime.now()
        logInfo("Jetzt", "Jetzt ist es {}", vJetzt1)
Log:

Code: Alles auswählen

2021-12-11 12:11:26.768 [INFO ] [org.openhab.core.model.script.Jetzt ] - Jetzt ist es 2021-12-11T12:11:26.766448+01:00[Europe/Berlin]
2021-12-11 12:11:26.774 [INFO ] [org.openhab.core.model.script.Jetzt1] - Jetzt ist es 2021-12-11T12:11:26.772441
Edit - Nachtrag : Ich habe noch zwei Möglichkeiten für einen Unix-Zeitstempel gefunden.

Code -Snippets:

Code: Alles auswählen

var vUnixTimeSecond = Instant.now().getEpochSecond();
        logInfo("Jetzt", "UnixTime (Epoch)Sekunden {}", vUnixTimeSecond)

var vUnixTimeMilli = Instant.now().toEpochMilli();
        logInfo("Jetzt", "UnixTime (Epoch)Milli-Sekunden {}", vUnixTimeMilli)
  
Log:

Code: Alles auswählen

2021-12-11 14:35:26.977 [INFO ] [org.openhab.core.model.script.Jetzt ] - UnixTime (Epoch)Sekunden 1639229726
2021-12-11 14:35:26.982 [INFO ] [org.openhab.core.model.script.Jetzt ] - UnixTime (Epoch)Milli-Sekunden 1639229726980

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 5. Feb 2022 19:21
von mad-mike
Moin.

Habe jetzt schon einiges versucht, nur ich komme damit nicht klar...
Möchte eigentlich nur Tage Zählen, von Start Datum 03. Feb. 2022.

Und dies Möchte ich in ein Item (laufzeit) schreiben...

Trigger sollte Every Day 6 uhr sein...

Könnte mir jemand einen helfen??

Danke und gruss

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 5. Feb 2022 19:56
von udo1toni

Code: Alles auswählen

val LocalDateTime start = new LocalDateTime(2022,2,3,6,0,0) // 06:00:00 am 03.02.2022
val Long days = Duration.between(start,ZonedDateTime.now()).toDays()
days ist eine Ganzzahl, also am 4. Februar um 05:59:59 liefert die Funktion dann 0, eine Sekunde später 1.

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 5. Feb 2022 20:18
von mad-mike
Danke für deine Antwort.

Könntest du dir das mal ansehen:

Code: Alles auswählen

rule "Laufzeit"

when
    Time cron "0 0 6 * * ? *"
then
    var day = LocalDate.parse("2022-02-03").atStartOfDay();
    var long days = Duration.between(day, now).toDays();
    Laufzeit.postUpdate(days)                                              
end
Habe im Item "Laufzeit" eine 2.00

Das ist das, woran ich mich versucht habe, bevor ich deine Antwort gelesen habe...


Danke und Gruss


Edit:
Habe im Item "Laufzeit" eine 2.00

konnte ich mit : %.0f auf 2 setzen.

Einstellung Item Pattern

Re: Vergangene Tage seit bestimmtem Datum berechnen

Verfasst: 5. Feb 2022 21:07
von udo1toni
ja, das geht auch. Da Laufzeit ja ein Number Item ist, nutzt es Float zur internen Darstellung, daher die Nachkommastellen. Lästig, aber kann man ja über die Formatierung korrigieren.