Python Zeitfenster von Herbst bis Fruehling naechstes Jahr

  • Hallo,

    ich habe ein Python script und bin mir nicht sicher ob dieser code so funktioniert, da die Zeitspanne ja sehr lange ist und ich es nicht richtig testen kann.



    Funktioniert das so, oder gibt es eine einfachere Loesung?

    Vielen Dank und Gruss

    gwaag

  • gwaag

    Changed the title of the thread from “Python Zeitfenster von Herbst bis Fruehling naechsets Jahr” to “Python Zeitfenster von Herbst bis Fruehling naechstes Jahr”.
  • Ich denke, das geht schief. Wenn du das im Januar 2022 ausführst, prüft er auf 1.10.22 < now und now <= 1.4.23 - das wird nicht klappen.

    Mach die Abfragen unabhängig vom Jahr.


    monat = datetime.now().month

    If (monat >= 10 or monat <= 3)

    ...


    oder so ähnlich.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Gnom

    Ja, Du hast recht, meine Loesung geht nicht.

    Probiere es jetzt so, nach Deinem Vorschlag:

    Code
    # Periode von Herbst bis Fruehling
    
    monat = datetime.now().month
    not_summer = (monat >= 10 or monat <= 3) # Anfangs Okt. bis Ende Maerz
    
    if not_summer:
        "mach etwas"

    Danke und Gruss

    gwaag

  • Dann würde ichs so machen:

    Code
    if not 3 < datetime.now().month < 10:
      print("Kein Sommer")


    Grüße

    Dennis

    🎵🎸Die Nordsee schlägt dir ins Gesicht, trotzdem hast du verloren, du bist nicht weit gekommen, du läufst weiter nach vorn 🎵🎸

  • Grüße,

    die schedule Lib kann kein von/bis.

    Sowas wird's laut den Entwicklern auch nicht geben.

    Man könnte aber aus der Kombi von Datetime und dem schedule eine Zeitschaltuhr bauen, wenn in den Sommermonaten irgendwas in einem bestimmten Intervall geschaltet werden soll.

  • da die Zeitspanne ja sehr lange ist und ich es nicht richtig testen kann.

    Hallo, doch kann man. Ob der Code der Logik entspricht oder nicht kann ich noch nicht beurteilen. Aber wir wollen das ja testen. Angenommen wir haben folgende Ausgangslage:

    So würde ich, um den Code testen zu können wie folgt abändern:

    und schon hast du innerhalb kurzer Zeit 2 Jahre überprüft :)

    Wir erstellen und also einfach eine Schleife und modifizieren das Datetimeobjekt und wiederholen das so oft bis die while Schleife sagt wir haben unseren gewünschten Testzeitraum überschritten.

    Das man nicht die vom Programm eigentlichen Funktionsaufrufe umschreiben muss, überschreibe ich das orginale now mit unserem simulierten Zeitpunkt

  • Ich habe das schon mal so gelöst:

    Datum formatiert als Zahl : Ymd

    ergibt z.B.


    von = "20211001"

    bis = "20220305"

    Jetzt einfach prüfen ob das aktuelle Datum kleiner von oder größer bis ist.

    Keine Ahnung wie das in python geht, ich hab es in PHP so gemacht.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?


    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Und im nächsten Jahr funktioniert das Programm nicht mehr...

    Ich würd mal die Jahreszahl weglassen!

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Kann man mit strings machen (vorher in int umwandeln), macht aber normalerweise niemand mehr.

    Selbst PHP wird dafür passende Funktionen/Methoden haben: https://www.php.net/manual/de/class.datetime.php

    Wozu sollen denn da Strings gut sein? Tag + Monat * 10 genügt doch völlig, um eine eindeutige, vergleichbare (aber nicht differenzfähige) Zahl für das Datum zu bekommen.

    "... wird dafür passende Methoden haben ..." orakel, orakel. Hat es aber nicht. Datetime und der ganze Zeitstempelkram rechnet mit Jahr/Monat/Tag/Stunde/Minute, Sekunde. Das Jahr interessiert hier aber nicht, Stunde, Minute, Sekunde ebenso. Es gibt hier auch keinen "Nullpunkt" wie den 1.1.1970, da man das jedes Jahr wieder korrekt haben will. Es geht einfach nur um Monat und Tag - unabhängig vom Jahr. Wenn man Vergleiche mit Datetime anstellen will, muss man das jeweils passende Jahr (aktuelles Jahr, Vorjahr, nächstes Jahr) setzen. Das hängt aber wiederum davon ab, ob an noch am Ende des letzten Jahres oder schon am Anfang den neune Jahres steht. Um das rauszukriegen, müsste man wieder den Monat betrachten. Das ist ziemlich komplziert.


    datum = datetime.now() # aktuelles Datum

    jahr = datum.year # aktuelles Jahr ermitteln

    anf = ... (jahr; 4, 1) # Zeitstempel aus dem aktuellen Jahr und den Start-/Endzeiten basteln

    end = ... (jahr, 10, 1)

    if ! (anf <= datum < end)... # Vergleich gültig für das aktuelle Jahr - deshalb jedes mal der Kram obendrüber


    Da finde ich sowas wie


    ! (401 <= datetime.now().month * 10 + datetime.now().day < 1001)


    deutlich einfacher.


    Da es hier sogar (wenn ich das richtig sehe) um volle Monate geht, wäre es noch einfacher mit


    ! (4 <= datetime.now().month < 10)

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Wo ist das Problem?

    Natürlich nicht wie hier im Beispiel hart codiert, sondern eleganter mit Konstanten am Codebeginn oder flexibel mit Variablen - aber am Ende sind die Zahlen relevant.


    Genügend Haken hat das allerdings immer noch. Wenn der Zeitraum nicht übers Jahresende geht, sondern andersrum - also der Endmonat größer ist als der Anfangsmonat, klappt es nicht mehr - dann muss man die Codelogik rundrehen (das ! weglassen) oder halt eine Prüfung auf Jahresüberschreitung machen und zwei Codevarianten einbauen. Diese Zeitprüfungsgeschichten sind grundsätzlich ziemlich heikel.

    Du siehst ja an deinem Code, was man für ein Gekasper machen muss. Zwei Zeiträume definieren, wenn es übers Jahresende lappt. Schaltjahr gesondert berücksichtigen, Tupel in Schleifen prüfen. ... Und was, wenn der gewünschte Zeitraum wirklich nur bis zum 28.2. gehen soll? Dann nimmt dein Code den 29. noch mit...

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Ist zwar OT, weil es eigentlich um Python geht, aber ich antworte trotzdem mal zwecks PHP.

    orakel, orakel. Hat es aber nicht.

    https://www.php.net/manual/de/function.getdate.php


    PHP
    <?php
    $array = getdate();
    echo "Monat als Zahl: ".$array["mon"]." Tag: ".$array["mday"];
    ?>
    Code: Ausgabe
    Monat als Zahl: 9 Tag: 22
  • PHP
    <?php
    $array = getdate();
    echo "Monat als Zahl: ".$array["mon"]." Tag: ".$array["mday"];
    ?>

    Das kann ja wohl hoffentlich jede halbwegs gängige Programmiersprache. Ich dachte, du meinst Funktionen, um solche Zeiteingrenzungen vernünftig zu handhaben...

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Ich meinte in diesem Thread bisher garnichts. ;) Mein Beitrag bezog sich lediglich darauf, dass man sich in PHP nicht zwangsläufig mit dem "Zeitstempelkram" rumplagen muss.


    Btw. Meines Erachtens ist eine gute Lösung für das Problem hier schon sehr frühzeitig geschrieben worden, da muss man nicht mit dem Niveau nach unten gehen um einen schlechteren Lösungsweg zu konstruieren.

  • Ich würd mal die Jahreszahl weglassen!

    Wäre eine Dumme Idee, da ja die Zeit nach dem 1.10. einen Jahres "größer" ist als die Zeit nach dem 5.3. des Folgejahres, wenn man das Jahr weg lässt.


    Eine Möglichkeit wäre es, den 1.10. eines jeden Jahres als Unix-Zeit zu nehmen (Startzeit), und dann nachzusehen, ob die Zeit größer ist als die Startzeit plus 155 (oder in Schaltjahren 156) Tage. Denn dann ist man außerhalb des gewünschten Zeitraums.

    Um als Startzeit wird in jedem Jahr die Unixzeit neu berechnet. Wenn man das in eine Konfigurationsdatei schreibt, kann man das zum Beispiel am 1.9. eines jeden Jahres per Cron erledigen lassen.

    Selber denken,
    wie kann man nur?