Seite 1 von 1

getZonedDateTime() .....deprecated

Verfasst: 20. Jan 2025 08:58
von Quautiputzli
Hallo miteinander,
wie in der Überschrift wird nun von OH4.3 auf folgenden Umstand hingewiesen:

Code: Alles auswählen

The method getZonedDateTime() from the type DateTimeType is deprecated
Das ganze funktioniert zwar noch, aber in Zukunft wahrscheinlich nicht mehr, ich möchte das deshalb berichtigen.

Hier ein Ausschnitt der Rule:

Code: Alles auswählen

    if(ZonedDateTime.now.getHour() < 16) { //  zwischen 0 Uhr und 16 Uhr
        if (ZonedDateTime.now.getMonthValue() > 3 && ZonedDateTime.now.getMonthValue() < 11 ) {
            en_batt = 0 // AUS
            logInfo("rules", logPrefix2 + "Sommerzeit. Setze en_batt auf({})", en_batt)
        }
Ich nutze das "ZonedDateTime" um die Zeit in Stunden oder den Monat herauszufinden, um davon abhängig etwas auszulösen.
Wie ist nun die richtige Syntax für so etwas? Oder mache ich das sowieso zu kompliziert?

Re: getZonedDateTime() .....deprecated

Verfasst: 20. Jan 2025 10:28
von udo1toni
getZonedDateTime() erwartet nun die Angabe der ZoneId, z.B. so:

Code: Alles auswählen

now.getZonedDateTime(ZoneId.systemDefault())
Allerdings kannst Du hier ZonedDateTime einfach weg lassen.

Abgesehen davon wäre das hier mutmaßlich die saubere Option (April bis Oktober ist ja schon etwas ungenau):

Code: Alles auswählen

val java.util.TimeZone tz = java.util.TimeZone.getTimeZone("Europe/Berlin")
if(tz.inDaylightTime(new java.util.Date) && now.getHour < 16) {
    logInfo("dst","Sommerzeit in Deutschland aktiv")
    ...
}
Alternativ kannst Du in einer rules-Datei auch die beiden Utilities TimeZone und Date im Dateikopf importieren, um anschließend nur TimeZone und Date schreiben zu müssen.

Re: getZonedDateTime() .....deprecated

Verfasst: 21. Jan 2025 08:53
von Quautiputzli
Danke :D

Re: getZonedDateTime() .....deprecated

Verfasst: 25. Jan 2025 09:05
von Lux73
Ich hänge mich hier mal mit rein - habe heute von 4.2.3 auf 4.3.2 upgedatet

allerdings habe ich in einer Rule auch ein Problem mit getZonedDateTime

Code: Alles auswählen

rule "eMail Timestamp"
when
	Member of gTimestamp changed
then
	if (!(gTimestamp.state instanceof DateTimeType)) return;
	
	if (Emailblocker_Timestamp.state != ON) {
		if (now.isAfter((gTimestamp.state as DateTimeType).getZonedDateTime.plusHours(8))) {
			getActions("mail","mail:smtp:MAILPROVIDER").sendHtmlMail("USER@DOMAIN:DE", "OpenHAB Alarm - Statusänderung "+triggeringItem.name+ " überfällig", "HINWEIS! Bitte: "+triggeringItem.name+ " prüfen! ...letzte Statusänderung ist länger als 8 Stunden her...")
			logInfo("myLog", "Timestamp - E-MAIL verschickt!")
			Emailblocker_Timestamp.postUpdate(ON)
		}
	}
end
alle meine Versuche

Code: Alles auswählen

if (now.isAfter((gTimestamp.state as DateTimeType).getZonedDateTime.plusHours(8))) {
entsprechend den Empfehlungen im OpenHAB Forum abzuändern schlagen fehl. Was ich schon probiert habe:

Code: Alles auswählen

if (now.isAfter((gTimestamp.state as DateTimeType).getZonedDateTime(ZoneId.systemDefault().plusHours(8)))) {
Fehler: Script execution of rule with UID 'email-2' failed: 'plusHours' is not a member of 'java.time.ZoneId'; line 40, column 71, length 35 in email

Code: Alles auswählen

if (now.isAfter((gTimestamp.state as DateTimeType).getInstant().plusHours(8))) {
Fehler: Script execution of rule with UID 'email-2' failed: 'plusHours' is not a member of 'java.time.Instant'; line 40, column 19, length 60 in email

insgesamt habe ich alle möglichen Varianten (welche mir logisch erscheinen) von hier https://community.openhab.org/t/the-met ... ted/160763 probiert

bekomme aber immer wieder 'plusHours' is not a member of 'java.time.ZoneId' - ich denke ich muss den Aufbau der Zeile grundsätzlich ändern und wäre für eine Hilfestellung diesbzgl. sehr dankbar :)

ich bin schon auf Java21 (zulu21) falls das irgendwie von Belang ist

Re: getZonedDateTime() .....deprecated

Verfasst: 25. Jan 2025 10:49
von Lux73
habs rausgefunden... zwar mehr try&error aber gut :mrgreen:

Code: Alles auswählen

if (now.isAfter((gTimestamp.state as DateTimeType).getZonedDateTime(ZoneId.systemDefault()).plusHours(8))) {
also war mein erster geänderter Codeblock schon richtig - allerdings war eine Klammer falsch gesetzt ^^

(ZoneId.systemDefault()) - die fehlte und bei .plusHours(8)))) war eine zuviel :lol:

war wohl noch nicht ganz wach ;)

Re: getZonedDateTime() .....deprecated

Verfasst: 25. Jan 2025 13:36
von udo1toni
Genau (falsch gesetzte Klammer, über den Grad der Wachheit erlaube ich mir kein Urteil ;) )

Wichtig: ZoneId.systemDefault() ist ein Parameter, der gehört zu getZonedDateTime().
.plusHours() ist eine Methode, die auf den von getZonedDateTime() gelieferten Wert angewendet wird.
Wenn man sich das klar macht, kommt man auch schnell auf die Klammern, bzw. wo diese zu setzen sind.