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:
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user