Zeitvergleich mit datetime

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
Patsche
User
Beiträge: 54
Registriert: Samstag 23. Oktober 2021, 00:17

Hi!

Ich versuche gerade etwas mit datetime herumzuspielen.
Jetzt möchte ich einmal "Hallo" ausgeben, wenn 10 Sekunden abgelaufen sind.

Hier mein Code:

Code: Alles auswählen

import datetime
a = datetime.datetime.now()
b = datetime.timedelta(seconds=10)
c = a + b
print(a)
print(b)
print(c)

while True:
    if datetime.datetime.now() == c:
        print("Hallo")
Zuerst möchte ich die Startzeit des Programms in Variable a festhalten, da diese ja fest ist.
Variable b und c gebe ich hier nur zu Testzwecken aus.
In der Endlosschleife verändert sich dann die aktuelle Zeit ständig, weshalb ich hier überprüfen möchte, wann die aktuelle Zeit gleich die Startzeit + 10 Sekunden ist.
Wo liegt mein Denkfehler?
Oder kann man das so nicht auf Gleichheit prüfen?
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Patsche: Was erwartest Du denn? Und was passiert stattdessen? Ich habe es gerade mal ausprobiert, und da hat es funktioniert.

Wobei ich allerdings weiss, dass das auch eher Glück sein kann. Schau Dir die Ausgaben an. Das nach dem "." sind die Sekundenbruchteile. Der Test muss exakt auf diesen Sekundenbruchteil genau erfolgen, weil Du mit ``==`` vergleichst. Ist der Rechner langsamer, oder genau zu dem Zeitpunkt mit etwas anderem beschäftigt, dann verpasst man den Zeitpunkt und es wird nie "Hallo" ausgegeben. Bei schlechter Auflösung der verwendeten Uhr kann es dagegen auch passieren, dass mehrere Schleifendurchläufe "Hallo" ausgeben.

Falls das nur einmal ausgegeben werden soll, dann muss man aus dem "==" ein ">=" machen, damit die Ausgabe auch erfolgt wenn man den exakten Zeitpunkt knapp verpasst hat. Und die Schleife nach der Ausgabe mit ``break`` verlassen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Patsche
User
Beiträge: 54
Registriert: Samstag 23. Oktober 2021, 00:17

Oh mann.....es kann so einfach sein. Ich war zu lange damit beschäftigt die Gleichheit zu überprüfen und habe dann völlig außer acht gelassen, dass es dann auch nur für diese Zeit ausgegeben wird.

Danke für die erneute Hilfe.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Den exakte gleichen Zeitpunkt zu erwischen ist relativ unwahrscheinlich. Deshalb muß man hier mit >= vergleichen und sich dann merken, dass man "Hallo" bereits ausgegeben hat.

Code: Alles auswählen

while True:
    print('.')
    if c and datetime.datetime.now() >= c:
        print("Hallo")
        c = None
    time.sleep(1)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Als Funktion lässt sich das einfacher wiederverwenden.
PS: zu spät gesehen, die Funktion macht etwas anderes, als du willst. Egal, als Beispiel lasse ich das mal stehen.

Code: Alles auswählen

import datetime
import time


def block_until(future: datetime.datetime) -> None:
    while future >= datetime.datetime.now():
        time.sleep(1)


# mit timedelta kann man rechnen
future = datetime.datetime.now() + datetime.timedelta(minutes=2, seconds=30)
block_until(future)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten