Sonnenstand: ueber die Tagesgrenze rechnen statt abschneiden

Ein Versatz, der ueber Mitternacht hinausreicht, wurde bisher am Tagesrand
abgeschnitten. Damit liessen sich "sechs Stunden vor Sonnenaufgang" oder
"fuenf Stunden nach Sonnenuntergang" gar nicht mehr formulieren - solche
Angaben sind aber gewollt und landen eben am Vorabend bzw. nach Mitternacht.

Gerechnet wird jetzt modulo Tag. Verglichen wird die Uhrzeit innerhalb des
Tages: ein Ziel jenseits von Mitternacht gilt als diese Uhrzeit am selben
Tag. Bei "+" und "-" ist das genau der gemeinte Zeitpunkt, bei "ab" und
"vor" verschiebt sich der wahre Bereich entsprechend mit - das steht so in
der README.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-31 13:10:20 +02:00
co-authored by Claude Opus 5
parent ee417f302f
commit 25d3c47bd3
2 changed files with 18 additions and 9 deletions
+8 -3
View File
@@ -69,9 +69,14 @@ folgen derselben Überlegung.
Beim Sonnenauf- und -untergang ist der Wert ein Versatz, und der kann davor Beim Sonnenauf- und -untergang ist der Wert ein Versatz, und der kann davor
oder danach liegen — deshalb dieselben drei Fälle mal zwei: `+ 00:30` eine oder danach liegen — deshalb dieselben drei Fälle mal zwei: `+ 00:30` eine
halbe Stunde nach Sonnenaufgang, `ab - 00:30` ab einer halben Stunde davor, halbe Stunde nach Sonnenaufgang, `ab - 00:30` ab einer halben Stunde davor,
`vor + 00:30` bis eine halbe Stunde danach. Rutscht ein Versatz rechnerisch `vor + 00:30` bis eine halbe Stunde danach.
über den Tagesrand, bleibt es beim Tagesrand — „kurz vor Sonnenaufgang" soll
nicht plötzlich gestern Abend bedeuten. Über den Tagesrand wird gerechnet, nicht abgeschnitten: „sechs Stunden vor
Sonnenaufgang" landet am Vorabend, und das ist so gewollt — abgeschnitten
wären solche Angaben gar nicht mehr formulierbar. Verglichen wird die Uhrzeit
innerhalb des Tages; ein Ziel jenseits von Mitternacht gilt als diese Uhrzeit
am selben Tag. Bei `+` und `-` ist das genau der gemeinte Zeitpunkt, bei `ab`
und `vor` verschiebt sich der wahre Bereich entsprechend mit.
`force_once` („am Ende des Zeitraums auf jeden Fall ausführen") greift, wenn `force_once` („am Ende des Zeitraums auf jeden Fall ausführen") greift, wenn
das Fenster zugeht und in diesem Fenster noch nichts passiert ist. das Fenster zugeht und in diesem Fenster noch nichts passiert ist.
+10 -6
View File
@@ -282,12 +282,16 @@ def bedingung_erfuellt(bedingung, state, wert, jetzt):
# davor: ">=-" heisst "ab einer halben Stunde davor". # davor: ">=-" heisst "ab einer halben Stunde davor".
versatz = minuten(soll) versatz = minuten(soll)
ziel = minuten(wert) + (-versatz if op.endswith("-") else versatz) ziel = minuten(wert) + (-versatz if op.endswith("-") else versatz)
# Ein Versatz kann rechnerisch ueber den Tagesrand rutschen # Ueber den Tagesrand wird gerechnet, nicht abgeschnitten: "sechs
# (Sonnenaufgang 05:34 minus sechs Stunden). Dann bleibt es beim # Stunden vor Sonnenaufgang" ist eine gewollte Angabe und landet
# Tagesrand, statt auf die andere Seite von Mitternacht zu # dann eben am Vorabend. Abgeschnitten waeren solche Faelle gar
# springen - "kurz vor Sonnenaufgang" soll nicht ploetzlich # nicht mehr formulierbar.
# gestern abend bedeuten. #
ziel = max(0, min(1439, ziel)) # Verglichen wird die Uhrzeit innerhalb des Tages. Ein Ziel
# jenseits von Mitternacht gilt also als diese Uhrzeit am selben
# Tag - bei "um" ist das genau der gemeinte Zeitpunkt, bei "ab"
# und "vor" verschiebt sich der wahre Bereich entsprechend.
ziel %= 1440
jetzt_m = jetzt.hour * 60 + jetzt.minute jetzt_m = jetzt.hour * 60 + jetzt.minute
if op.startswith(">="): return jetzt_m >= ziel if op.startswith(">="): return jetzt_m >= ziel
if op.startswith("<"): return jetzt_m < ziel if op.startswith("<"): return jetzt_m < ziel