Funktion in bestimmtem Zeitfenster ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Guten Morgen,

wie löse ich am elegantesten, dass eine Funktion nur in einem bestimmten Zeitfenster ausgeführt wird?
Eine Variante ist ja immer, dass ich das über zwei Cronjobs abbilde, aber vielleicht gibt es eine charmante
Lösung in python selbst.

Hier mal ein pseudocode:

Code: Alles auswählen

if current_time between 06:00 and 22:00:
    execute_function
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Code: Alles auswählen

import datetime
import time



def time_input(text):
    while True:
        try:
            time = datetime.datetime.strptime(input(text), '%H:%M').time()
            return time
        except ValueError:
            print("Die Uhrzeit ist nicht in dem Format HH:MM")

def main():
    start_time = time_input("Gib die Startuhrzeit an (HH:MM): ")
    end_time = time_input("Gib die Enduhrzeit an (HH:MM): ")
    while True:
        current_time = datetime.datetime.now().time()
        if current_time > start_time and current_time < end_time:
            print(f" Die aktuelle Zeit ist: {current_time.strftime('%H:%M:%S')} und liegt somit im Zeitraum zwischen {start_time.strftime('%H:%M')} und {end_time.strftime('%H:%M')}")
        else:
            print(f" Die aktuelle Zeit ist: {current_time.strftime('%H:%M:%S')} und liegt somit NICHT im Zeitraum zwischen {start_time.strftime('%H:%M')} und {end_time.strftime('%H:%M')}")
        time.sleep(1)


main()
oder als einzelne Funktion (benutzt die time_input Funktion von oben in der main()):

Code: Alles auswählen

def is_curent_time_between_times(start_time, end_time):
    current_time = datetime.datetime.now().time()
    return current_time > start_time and current_time < end_time

def main():
    start_time = time_input("Gib die Startuhrzeit an (HH:MM): ")
    end_time = time_input("Gib die Enduhrzeit an (HH:MM): ")
    while True:
        if is_curent_time_between_times(start_time, end_time):
            print("IN TIME")
        else:
            print("NOT IN TIME")
        time.sleep(1)
        
main()
oder vielleicht ist was für dich im schedule Modul dabei.
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

@CoderGirl: was meinst Du mit "Funktion nur in einem bestimmten Zeitfenster ausführen"? Wenn Du ein Programm regelmäßig ausführen willst, egal ob nur in einem bestimmten Zeitbereich oder nicht, ist ein Cronjob das richtige. Warum denkst Du, Du brauchst dafür zwei?
Oder handelt es sich um eine Funktion, die von irgend einem anderen Ereignis (außer Zeit) aufgerufen wird, dann prüfst Du einfach, ob die Funktion während eines bestimmten Zeitbereichs aufgerufen worden ist, und reagierst entsprechend.
Also, um was für ein Problem handelt es sich konkreter?

@Jankie: bei Format-Strings kann man die Zeitformatierung direkt angeben:

Code: Alles auswählen

print(f" Die aktuelle Zeit ist: {current_time:%H:%M:%S} und liegt somit im Zeitraum zwischen {start_time:%H:%M} und {end_time:%H:%M}")
Die Vergleichsoperation "zwischen" schreibt man in Python kürzer:

Code: Alles auswählen

def is_curent_time_between_times(start_time, end_time):
    current_time = datetime.datetime.now().time()
    return start_time <= current_time < end_time
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Hallo euch beiden

Danke, damit kann ich was anfangen. Was Sirius meinte, ist das , was ich auch meine. Die Funktion nur zu einer bestimmten Uhrzeit ausführen,
was ich mit dem Pseudocode andeuten wollte.
Ich schicke eine Telegram_message bei einer Exception, die aber nur geschickt werden soll, wenn es zwischen 06 und 22 Uhr ist :)

Vielen Dank euch beiden :)
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Ich habe dann doch noch eine Frage; es geht um das Format des datetime-Objekts.

Kann es so schreiben oder muss ich es anders deklarieren?

Code: Alles auswählen

start_time = 06:00
end_time = 22:00

def is_curent_time_between_times(start_time, end_time):
    current_time = datetime.datetime.now().time()
    return start_time <= current_time < end_time
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

So funktioniert es nicht, du musst nämlich die Uhrzeit in ein datetime.time() Objekt umwandeln.

Code: Alles auswählen

#so
start_time = datetime.time(6)
end_time = datetime.time(22)


#oder so
start_time = datetime.datetime.strptime("06:00", '%H:%M').time()
end_time = datetime.datetime.strptime("22:00", '%H:%M').time()
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Danke, ich habe genau daher gefragt, da ich da schon paar Mal gestrauchelt habe.
Vielen Dank!!
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Antworten