Wie vergleiche ich Zeiten in Python?

97

Ich sehe, dass Datumsvergleiche durchgeführt werden können und es gibt auch datetime.timedelta() , aber ich habe Schwierigkeiten herauszufinden, wie ich überprüfen kann, ob die aktuelle Zeit ( datetime.datetime.now()) früher, später oder gleich einer bestimmten Zeit (z. B. 8 Uhr morgens) ist, unabhängig vom Datum.

Steve Jay
quelle
1
Ich bin mir nicht sicher, ob ich dies als Antwort verwenden soll, aber ich habe es hier als Kommentar angegeben: Überraschenderweise habe ich festgestellt, dass Python Vergleiche wie '23:23:00' > '23:59:00'oder akzeptiert '23:23:00' > '23:09:22', genau wie Sie es zwischen zwei datetime.datetime.now().strftime('%H:%M')Werten tun würden . Ist es der beste Weg, um einen Vergleich zwischen den Zeiten zu erreichen? Ich weiß es nicht. Funktioniert es? Soweit ich getestet habe, hat es gut funktioniert. Aber definitiv (und natürlich): keine Chance, dies mit einer Datums- / Uhrzeitzeichenfolge zu verwenden, die Monat und Wochentage hat.
ivanleoncz

Antworten:

127

Das kannst du nicht einen bestimmten Zeitpunkt (z. B. "gerade jetzt") nicht mit einem nicht festgelegten, wiederkehrenden Ereignis vergleichen (jeden Tag um 8 Uhr morgens).

Sie können überprüfen, ob jetzt vor oder nach dem heutigen 8 Uhr morgens ist:

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

quelle
4
Vielleicht möchten Sie die Annahme auf die Antwort von Pär Wieslander umdrehen (und sollten im Allgemeinen ein paar Minuten länger warten als Sie: P), da sie etwas spezifischer für genau das ist, was Sie gefragt haben.
65

Sie können die Verwendung time()Methode der datetimeObjekte die Tageszeit zu erhalten, die Sie für den Vergleich , ohne das Datum berücksichtigt verwenden können:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True
Pär Wieslander
quelle
2
Achten Sie darauf , zu tun datetime.datetime.now().time(), vergessen Sie nicht die Klammern in now()!
Jose Salvatierra
10

Sie können datetime.datetime-Objekte direkt vergleichen

Z.B:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 
Kimvais
quelle
4

Inspiriert von Roger Pate:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"
AndrewR
quelle
2

Eine andere Möglichkeit, dies zu tun, ohne Abhängigkeiten hinzuzufügen oder datetime zu verwenden, besteht darin, einfach die Attribute des Zeitobjekts zu berechnen. Es hat Stunden, Minuten, Sekunden, Millisekunden und eine Zeitzone. Für sehr einfache Vergleiche sollten Stunden und Minuten ausreichen.

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

Ich empfehle dies nur, wenn Sie einen unglaublich einfachen Anwendungsfall haben. Für alles, was Zeitzonen- oder Datumserkennung erfordert, sollten Sie datetime verwenden.

Thomas Dignan
quelle
1

datetime haben Vergleichsmöglichkeiten

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False
luc
quelle
1

Überrascht habe ich diesen einen Liner hier nicht gesehen:

datetime.datetime.now().hour == 8
Jesse Reza Khorasanee
quelle
1

Sie können die Timedelta-Funktion für den Vergleich der x-Zeiterhöhung verwenden.

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

Nur eine Kombination dieser Antworten dies und Roger

Arischer Vikash
quelle