Jak porównać czasy w Pythonie?

106

Widzę, że można dokonać porównań dat i jest też datetime.timedelta(), ale staram się dowiedzieć, jak sprawdzić, czy aktualna godzina ( datetime.datetime.now()) jest wcześniejsza, późniejsza lub taka sama niż określona godzina (np. 8 rano) niezależnie od daty.

Steve Jay
źródło
2
Nie jestem pewien, czy podać to jako odpowiedź, ale umieściłem to tutaj jako komentarz: zaskakująco odkryłem, że Python akceptuje porównania typu '23:23:00' > '23:59:00'lub '23:23:00' > '23:09:22', tak jak zrobiłbyś to między dwiema datetime.datetime.now().strftime('%H:%M')wartościami. Czy jest to najlepszy sposób na porównanie czasów? Nie wiem Czy to działa? O ile testowałem, działało dobrze. Ale zdecydowanie (i oczywiście): nie ma szans na użycie tego z ciągiem daty i godziny, które mają miesiąc i dni tygodnia.
ivanleoncz

Odpowiedzi:

139

Nie można porównać określonego punktu w czasie (na przykład „teraz”) z nieokreślonym, powtarzającym się wydarzeniem (codziennie o 8 rano).

Możesz sprawdzić, czy teraz jest przed, czy po dzisiejszej 8:00:

>>> 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

źródło
4
Możesz chcieć odwrócić akceptację do odpowiedzi Pär Wieslandera (i generalnie powinieneś poczekać kilka minut więcej niż to zrobiłeś: P), ponieważ jest ona nieco bardziej szczegółowa dla dokładnie tego, o co prosiłeś.
69

Możesz skorzystać z time()metody datetimeobiektów, aby uzyskać porę dnia, której możesz użyć do porównania bez uwzględnienia daty:

>>> 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
źródło
2
Upewnij się, że tak datetime.datetime.now().time(), nie zapomnij o nawiasach now()!
Jose Salvatierra
10

Możesz bezpośrednio porównać obiekty datetime.datetime

Na przykład:

>>> 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
źródło
5

Zainspirowany Rogerem 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
źródło
2

Innym sposobem na zrobienie tego bez dodawania zależności lub używania daty i godziny jest po prostu wykonanie pewnych działań matematycznych na atrybutach obiektu czasu. Zawiera godziny, minuty, sekundy, milisekundy i strefę czasową. W przypadku bardzo prostych porównań wystarczające powinny być godziny i minuty.

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

Nie polecam tego robić, chyba że masz niewiarygodnie prosty przypadek użycia. Do wszystkiego, co wymaga znajomości strefy czasowej lub dat, powinieneś używać daty i godziny.

Thomas Dignan
źródło
2

Zaskoczony, że nie widziałem tutaj tej jednej wkładki:

datetime.datetime.now().hour == 8
Jesse Reza Khorasanee
źródło
2

Możesz użyć funkcji Timedelta do porównania wzrostu czasu x.

>>> import datetime 

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

False

Tylko połączenie tych odpowiedzi to I Roger

Aryan Vikash
źródło
1

datetime mają możliwość porównania

>>> 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
źródło