Seite 1 von 1

Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 05:53
von CoderGirl
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

Re: Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 06:27
von Jankie

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.

Re: Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 07:10
von Sirius3
@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

Re: Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 08:00
von CoderGirl
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 :)

Re: Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 08:21
von CoderGirl
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

Re: Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 08:29
von Jankie
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()

Re: Funktion in bestimmtem Zeitfenster ausführen

Verfasst: Donnerstag 17. September 2020, 09:03
von CoderGirl
Danke, ich habe genau daher gefragt, da ich da schon paar Mal gestrauchelt habe.
Vielen Dank!!