2016-06-06 9 views
0

In einer Django-Website, die ich pflege, muss ich überprüfen, ob sich Benutzer während bestimmter Zeitfenster jeden Tag angemeldet (und eine bestimmte Aufgabe ausgeführt) haben. Diese Zeitfenster sind festgelegt und wiederholen sich täglich. Zum Beispiel Fenster # 1 zwischen 03.00 und 06.30 (einschließlich), während Fenster # 2 ist 11.50 und 2: 45P M (einschließlich).Zeitvergleich in Python

Immer wenn ein Benutzer auf die Website zurückkehrt, erhalte ich time_now = datetime.datetime.now(). Und da mir nur die Zeit wichtig ist, benutze ich time_now.time(). Als nächstes muss ich überprüfen, ob time_now.time() in eines der oben genannten Zeitfenster fällt.

Ich bin mir nicht sicher, wie man diesen Vergleich in Python macht. Insbesondere, wie definiere ich die Zeitobjekte, die die Zeitfenster steuern? Wird es etwas wie sein:

time_now = datetime.datetime.now() 
now = time_now.time() 
today3am = now.replace(hour=3, minute=0, second=0, microsecond=0) 
today630am = now.replace(hour=6, minute=30, second=0, microsecond=0) 
if today3am < now < today630am: 
    #do something 

(und ebenso für das zweite Zeitfenster).

Bitte geben Sie an, ob dies der richtige Weg ist oder nicht. Alternativ sind auch bessere Methoden (performance-weise) willkommen.

Antwort

1

Ich glaube nicht, dass Sie die hour und minute in der gegenwärtigen Zeit ersetzen müssen. Da Sie time() von time_now erhalten haben, können Sie es einfach mit einem anderen time Objekt vergleichen.

dt_now = datetime.datetime.now() 
t_now = dt_now.time() 

Nun müssen Sie die untere und obere Grenze:

t_3am = datetime.time(hour=3, minute=0) 
t_630am = datetime.time(hour=6, minute=30) 

Einmal haben Sie diese Sie die Zeit direkt Objekte vergleichen kann:

if t_3am < t_now <= t_630am: # used <= to make the upper bound inclusive 
    # do something 

Performance weise, würde ich sagen, Sie sollten t_3am und t_630am als Konstanten behandeln, da diese sich nicht ändern werden. Ein besserer Weg wäre also, es nur einmal zu definieren und die hour und minute nicht jedes Mal zu ersetzen, wenn Sie die aktuelle Zeit bekommen.

+0

Aus irgendeinem Grund gibt 'datetime.time (hour = 3, minute = 0) 'mir ** descriptor' time 'von' datetime.datetime 'ein Objekt benötigt ein Argument ** –

+0

Wenn Sie' datetime 'dann importieren Sie können 'datetime.datetime' und' datetime.time' verwenden. Sie erhalten diesen Fehler, wenn Sie 'from datetime import datetime' eingeben. – AKS

+0

Bekam es, danke @AKS. –

1

Ein paar Kommentare.

  1. Ja, dies ist der richtige Weg, um Datetime-Objekte zu vergleichen. Die datetime docs zeigen, dass Datetime-Objekte arithmetische, multiplikative und vergleichende Operationen unterstützen.

  2. Ich bezweifle, dass der Beispielcode, den Sie oben zur Verfügung gestellt haben, in Produktion geht, aber Ihre if Aussage ist in diesem Fall exklusiv, nicht inklusive wie Sie in Ihrer Frage erwähnt haben. Ich bin mir auch sicher, dass Sie wissen, wie man es in eine inklusive if-Anweisung umwandelt, aber ich werde es für andere einbeziehen.

    if today3am <= now <= today630am: 
        ## This is true if now is 
        ## 03:00 or 03:01 
    
  3. Performance weise, ich bin nicht sicher, wie granular Sie suchen zu erhalten. Wenn das Protokollieren der Zeit das einzige Ding ist, das Sie interessieren, würde ich vorschlagen, das time object im datetime Modul zu verwenden. Dies erzeugt ein Objekt, das frei von allen Datumsdaten ist, wodurch das resultierende Objekt weniger RAM belegt, was vermutlich die Vergleiche beschleunigt. Ich glaube jedoch, dass der Unterschied zwischen den beiden Ansätzen vernachlässigbar sein wird. Ich überlasse es Ihnen, dies zu testen und den Ansatz zu wählen, der Ihre Ziele am besten unterstützt.

+0

Danke für den Eingang Austin. –