2016-03-22 8 views
0

Ich versuche, zwei Mal innerhalb der Genauigkeit einer Sekunde zu vergleichen, aber ich finde einige Male der Code anders berechnet und mein Vergleich funktioniert nicht und die Schleife wird unendlich ausgeführt. Ich habe meinen Code unten,Python-Zeit-Dauer-Vergleich

start_time = datetimenow() #datetimenow is a function which returns time w/o microseconds    
end_time = start_time + timedelta(seconds = GrabDuration) 
while datetimenow() != end_time: #this part fails sometimes and passes sometimes 
    time.sleep(Grabtime) 
    saveas(imggrab()) 

als Referenz eingefügt Wenn Sie eine andere bessere Möglichkeit haben Zeit und Zeitdauer zu vergleichen ich es schätzen würde, wenn Sie teilen könnten. GrabDuration & Grabtime ist eine vom Benutzer angegebene Variable für die Dauer.

Antwort

0
import datetime 
import time 
start_time = datetime.datetime.now() 
end_time = start_time + datetime.timedelta(seconds = GrabDuration) 
while start_time != end_time: 
    time.sleep(Grabtime) 

wenn Sie Vergleich zwischen Start- und Endzeit haben, dann ist diese while-Schleife des Codes nur unendlich oft ausgeführt werden, wenn START_TIME nicht gleich

END_TIME jedoch der Code, den Sie freigegeben haben, dass die while-Schleife nehmen Sie wieder die aktuelle Systemzeit und verwenden nicht die Variable strat_time für Ihren Vergleich. Bitte überprüfe das.

Sie können auch verwenden datetime.datetime.now(). Time() Methode auch wie datetime.datetime.now(). Time() < datetime.time (Stunde = 2, Minute = 10, zweite = 10) . Dies kann Ihnen helfen, Ihre Bedenken zu lösen.

+0

danke, dein Snippet hatte dasselbe Problem, hier ist der Ausdruck des Vergleichs. Sie können sehen, dass die Zeit eine Sekunde bis 3 Sekunden überspringt, obwohl die Benutzereingabe für Grabtime 2 Sekunden betrug. 2016-03-23 ​​15:49:50 = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:49:53 # übersprungenen bis 3 sec = 2016-03-23 ​​15: 49:52 2016.03.23 15.49.55 # Gute = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:49:57 # Gute = 2016.03.23 15:49:52 2016-03-23 ​​15:49:59 # Gute = 2016-03-23 ​​15:49:52 2016-03-23 ​​15:50:02 # Bad = 2016-03 -23 15:49:52 2016-03-23 ​​15:50:04 #GOod = 20 16-03-23 ​​15:49:52 2016-03-23 ​​15:50:06 #Good = 2016-03-23 ​​15:49:52 – tensingd1

1

ich datetimenow gehe davon ist ein Standard datetime.datetime Objekt zurückkehrt, so dass im Grunde ist es wie folgt aus:

from datetime import datetime 

def datetimenow(): 
    return datetime.now() 

datetime Objekte mit == oder != Vergleich macht es ein bisschen schwierig, weil es eine geringe Menge an Zeit in Anspruch nimmt für sie nicht gleich sein.

als Test gerade diese Zeilen in einem Python-ERSATZ versuchen (vorausgesetzt, die oben genannten Linien als auch eingegeben werden, so dass die datetimenow() Funktion aufzurufen verfügbar:

datetimenow() == datetimenow() 

Und es ist durchaus möglich, unter mehreren Versuchen Sie ‚ll ein paar False Ergebnisse erhalten

ich würde vorschlagen, die datetime Objekte mit sicheren Vergleichsoperator, um so etwas zu vergleichen.

while datetimenow() <= end_time: 
    time.sleep(Grabtime) 
    saveas(imggrab()) 
+0

Danke und ja die Datetimenow() Funktion gibt eine Standard Datetime zurück. Datum-Zeit-Objekt. Es ist die While-Schleife, die schwierig wird, ich möchte die Schleife ausführen, bis die Zeit gleich wird. Aber was ich gefunden habe, ist der Szenerio ist nicht immer die ganze Zeit, obwohl die end_time aus dem Datetimenow() plus Benutzerwert abgeleitet ist. Die Schleife funktioniert so, wie ich für einige der Läufe vorgesehen war, aber manchmal wird sie bis unendlich ausgeführt. Grundsätzlich möchte ich, dass die Schleife bis zur aktuellen Zeit ausgeführt wird, die der vom Benutzer angegebenen Zeit entspricht, und sie sollte auf die Sekunden genau sein. – tensingd1

+0

Es ist eine allgemeine Anforderung, einen Prozess auszuführen, aber stellen Sie sicher, dass es nicht länger als eine bestimmte Zeit dauert. Verwenden Sie '<=' Operator, um die Zeiten zu vergleichen, anstatt '==' beantwortet diese Anforderung. Aber in Wirklichkeit haben wir keine Kontrolle über die Zeit (noch; P). Es ist mir nicht klar, wie Sie genau für eine bestimmte Zeit verarbeiten möchten, besonders wenn die Verarbeitung IO enthält. Wenn Sie mit Zeitwerten arbeiten, ist es sicherer, keine genauen Vergleiche zu verwenden. – farzad

+0

Hey Farzad, ich habe die Lösung gefunden. Es ist die Funktion sleep(), die manchmal falsche Zeiten ausgibt. Anstelle eines passiven Zeitzählers oder einer Wartefunktion wie sleep(), wenn wir durch eine aktive while-Schleife ersetzen, die auf jede benötigte Sekunde wartet, erhalten wir eine Wartefunktion, die Ihnen jedes Mal die genaue Zeit gibt. – tensingd1