Seite 1 von 1

Zeitvergleich mit datetime

Verfasst: Samstag 15. Juli 2023, 11:26
von Patsche
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?

Re: Zeitvergleich mit datetime

Verfasst: Samstag 15. Juli 2023, 12:03
von __blackjack__
@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.

Re: Zeitvergleich mit datetime

Verfasst: Samstag 15. Juli 2023, 12:08
von Patsche
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.

Re: Zeitvergleich mit datetime

Verfasst: Samstag 15. Juli 2023, 12:14
von Sirius3
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)

Re: Zeitvergleich mit datetime

Verfasst: Montag 17. Juli 2023, 09:05
von DeaD_EyE
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)