Seite 4 von 6
Re: Laufende Wochenzahl errechnen
Verfasst: 23. Sep 2021 16:29
von PJH
Hallo liebe Helfer,
da habt ihr euch ja mächtig in's Zeug gelegt.
Ja, die Lösung von int5749 funktioniert, zumindest zur Zeit.
Das ist eine Vereinfachung gegenüber der ersten Lösung von peter-pan, daher nehme ich diese.
Nochmals vielen Dank für die freundliche Hilfe. PJH
Re: Laufende Wochenzahl errechnen
Verfasst: 23. Sep 2021 17:13
von int5749
PJH hat geschrieben: ↑23. Sep 2021 16:29
Ja, die Lösung von funktioniert, zumindest zur Zeit.
Hi PJH
evtl. postest Du mal den kompletten Code, falls noch jemand den Bedarf hat und das Rad nicht neu erfunden werden muss
Viele Grüße
Re: Laufende Wochenzahl errechnen
Verfasst: 23. Sep 2021 17:18
von PJH
@int5749
Das mache ich gerne, aber speziell welchen Code, nur für die Errechnung der Wochenzahl?
Und wohin? In diese Rubrik?
Gruß. PJH
Re: Laufende Wochenzahl errechnen
Verfasst: 23. Sep 2021 23:20
von int5749
@PJH
Den Code zur Errechnung der Wochenzahl und wenn Du es für sinnvoll erachtest auch gerne, wofür Du dies nutzt. Evtl. kann dann jemand dies für seine Zwecke als Input nutzen und abwandeln. Funktionierender Code ist immer gerne gesehen
Da es zu diesem Thema passt, gerne hier. Verschieben kann man zur Not immer noch.
Re: Laufende Wochenzahl errechnen
Verfasst: 4. Okt 2021 10:25
von PJH
Hallo, ich habe jetzt länger hier in dieser Sache nicht von mir hören lassen, der Grund: ich wollte den von "int5749" vorgeschlagenen Code eine Weile auf Funktionstauglichkeit über prüfen.
Leider funktioniert er doch nicht. Der Berechnungsvorgang ist eigentlich genau derselbe wie bei meiner ersten Berechnung (Tageszahl/7).
Manchmal haut's hin und manchmal nicht (siehe die diversen Beiträge).
Ich habe jetzt wieder die von "peter-pan" vorgeschlagene Lösung eingestellt. Sie ist zwar etwas umständlich, funktioniert aber.
Schöne Grüße. Paul-Joachim Haucke
Re: Laufende Wochenzahl errechnen
Verfasst: 4. Okt 2021 11:47
von udo1toni
Ja, da ist noch ein Fehler in der Formel, weil der 1.1. halt nicht Anfang der Woche ist.
Ich hatte jetzt gerade mal etwas Zeit, mich etwas intensiver damit zu beschäftigen. So sieht meine Lösung aus:
Code: Alles auswählen
val firstMonday=now.withDayOfYear(8).minusDays(now.withDayOfYear(1).getDayOfWeek)
val actualMonday=now.plusDays(7).minusDays(now.getDayOfWeek)
val weeks = ((actualMonday-firstMonday)/7).intValue + if(firstMonday.getDayOfYear > 3) 1 else 0
Es fehlt aber noch Code für die Sonderfälle.
In der ersten Zeile wird das Datum des ersten Montags im Jahr bestimmt.
In der zweiten Zeile wird das Datum des Montags in der laufenden Woche bestimmt.
In der dritten Zeile werden die beiden Daten voneinander abgezogen und durch 7 geteilt. Eventuell muss man hier zunächst auf Tage umrechnen, ich habe das jetzt nur in Excel durchgespielt. .intValue ist eigentlich nicht nötig, da immer eine durch 7 teilbare Zahl entstehen sollte, aber das Ergebnis wäre halt kein Integer mehr. Der ternäre Operator zählt eins dazu, falls das Jahr mit Montag bis Donnerstag beginnt.
Abzufangen wäre noch die KW 0 (die muss aus dem Vorjahr berechnet werden, entweder 52 oder 53) und die KW 53, die nur dann 53 sein darf, wenn das Nachfolgejahr mit KW 0 beginnt, ansonsten muss es KW 1 (des Nachfolgejahres) sein.
Der eigentliche Punkt in der Berechnung ist, dass man zunächst dafür sorgt, dass man überall mit dem gleichen Wochentag rechnet, also hier mit Montag.
Vermutlich muss man now auch noch auf 0:00:00 Uhr schieben. (now.with(LocalTime.MIDNIGHT).withDayOfYear...).
Ich habe die Berechnung nicht in openHAB getestet, aber in Excel stimmt es so. Sollte die Berechnung so nicht funktionieren, könnte man auch jeweils den Tag des Jahres ausrechnen und diesen in der Subtraktion nutzen.
Re: Laufende Wochenzahl errechnen
Verfasst: 4. Okt 2021 11:57
von PJH
Hallo udo1toni, danke für die Mühe, aber ist es da die Lösung von "peter-pan" nicht doch noch einfacher?
Schöne Grüße. PJH
Re: Laufende Wochenzahl errechnen
Verfasst: 4. Okt 2021 12:02
von udo1toni
So, hat mir keine Ruhe gelassen...
Code: Alles auswählen
val firstMonday = now.with(LocalTime.MIDNIGHT).withDayOfYear(8).minusDays(now.withDayOfYear(1).getDayOfWeek).getDayOfYear
val actualMonday = now.with(LocalTime.MIDNIGHT).plusDays(7).minusDays(now.getDayOfWeek).getDayOfYear
var weeks = ((actualMonday-firstMonday)/7).intValue + if(firstMonday > 3) 1 else 0
if(weeks == 0)
weeks = if(firstMonday == 3) 53 else 52
else if (weeks == 53)
if(now.with(LocalTime.MIDNIGHT).plusDays(14).minusDays(now.getDayOfWeek).getDayOfYear > 3)
weeks = 1
Der Code nutzt nun Mitternacht und geht gleich auf den Tag des Jahres, das ist ein Integer Wert, damit müsste die BErechnung dann auf jeden Fall funktionieren.
Das erste If setzt statt der 0 eine 53 oder 52, je nach dem 1. Montag (der liegt ja schon vor...)
das else betrachtet die letzten Tage des Jahres und bestimmt dazu den 1. Montag im nächsten Jahr. liegt dieser nach dem 3., so ist die 53. Woche in Wirklichkeit die 1. Woche des Folgejahres.
Re: Laufende Wochenzahl errechnen
Verfasst: 4. Okt 2021 12:04
von udo1toni
PJH hat geschrieben: ↑4. Okt 2021 11:57
Hallo udo1toni, danke für die Mühe, aber ist es da die Lösung von "peter-pan" nicht doch noch einfacher?
Schöne Grüße. PJH
Bei aller Liebe, es geht nicht nur darum, es möglichst einfach umzusetzen, sondern vor allem korrekt.
Die einfache Lösung wäre eine entsprechende Funktion now.getISOWeekOfYear, die aber leider nicht zur Verfügung steht.
Re: Laufende Wochenzahl errechnen
Verfasst: 4. Okt 2021 13:43
von PJH
Also, "udo1toni", bei der Mühe (und Raffinesse)werde ich das auf jeden Fall benutzen.
Ich werde berichten. Einstweilen, vielen Dank.
PS: Warum die Funktion wohl nicht implementiert ist?
Schöne Grüße. Paul-Joachim Haucke^