Como comparar tempos em Python?

98

Vejo que comparações de datas podem ser feitas e há também datetime.timedelta(), mas estou lutando para descobrir como verificar se a hora atual ( datetime.datetime.now()) é anterior, posterior ou igual a uma hora especificada (por exemplo, 8h), independentemente da data.

Steve Jay
fonte
1
Não tenho certeza sobre como colocar isso como uma resposta, mas coloquei aqui como um comentário: surpreendentemente, descobri que Python aceita comparações como '23:23:00' > '23:59:00'ou '23:23:00' > '23:09:22', assim como você faria entre dois datetime.datetime.now().strftime('%H:%M')valores. É a melhor forma de comparar os tempos? Eu não sei. Funciona? Tanto quanto eu testei, funcionou bem. Mas definitivamente (e claro): não há chance de usar isso com a string datetime que tem mês, dias da semana.
ivanleoncz

Respostas:

128

Você não pode comparar um momento específico (como "agora") com um evento recorrente não corrigido (8 horas da manhã acontecem todos os dias).

Você pode verificar se agora é antes ou depois das 8h de hoje :

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

fonte
4
Você pode querer mudar a aceitação para a resposta de Pär Wieslander (e geralmente deve esperar mais alguns minutos do que você esperou: P), pois é um pouco mais específico para exatamente o que você perguntou.
65

Você pode usar o time()método de datetimeobjetos para obter a hora do dia, que pode ser usada para comparação sem levar em consideração a data:

>>> 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
fonte
2
Certifique-se de fazer isso datetime.datetime.now().time(), não se esqueça dos colchetes now()!
Jose Salvatierra
10

Você pode comparar objetos datetime.datetime diretamente

Por exemplo:

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

Inspirado por 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
fonte
2

Outra maneira de fazer isso sem adicionar dependências ou usar datetime é simplesmente fazer algumas contas nos atributos do objeto de tempo. Possui horas, minutos, segundos, milissegundos e um fuso horário. Para comparações muito simples, horas e minutos devem ser suficientes.

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

Não recomendo fazer isso, a menos que você tenha um caso de uso incrivelmente simples. Para qualquer coisa que requeira reconhecimento de fuso horário ou reconhecimento de datas, você deve usar datetime.

Thomas Dignan
fonte
1

datetime tem capacidade de comparação

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

Estou surpreso por não ter visto este forro aqui:

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

Você pode usar a função Timedelta para comparação de aumento de x tempo.

>>> import datetime 

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

False

Just A combinação dessas respostas esta E Roger

Aryan Vikash
fonte