Comparaciones de fechas de Python
Pregunta
Me gustaría saber si un objeto particular de fecha y hora de Python es anterior a X horas o minutos. Estoy tratando de hacer algo similar a:
if (datetime.now() - self.timestamp) > 100
# Where 100 is either seconds or minutes
Esto genera un error de tipo.
¿Cuál es la forma correcta de hacer una comparación de fecha y hora en Python? Ya miré WorkingWithTime que está cerca pero no exactamente lo que quiero. Supongo que solo quiero que el objeto datetime esté representado en segundos para poder hacer una comparación int normal.
Publique listas de las mejores prácticas de fecha y hora.
Solución
Utilice la clase datetime.timedelta
:
>>> from datetime import datetime, timedelta
>>> then = datetime.now() - timedelta(hours = 2)
>>> now = datetime.now()
>>> (now - then) > timedelta(days = 1)
False
>>> (now - then) > timedelta(hours = 1)
True
Su ejemplo podría escribirse como:
if (datetime.now() - self.timestamp) > timedelta(seconds = 100)
o
if (datetime.now() - self.timestamp) > timedelta(minutes = 100)
Otros consejos
Compare la diferencia con un timedelta que cree:
if datetime.datetime.now() - timestamp > datetime.timedelta(seconds = 5):
print 'older'
Alternativa:
if (datetime.now() - self.timestamp).total_seconds() > 100:
Suponiendo que self.timestamp es una instancia de fecha y hora
Puede usar una combinación de los atributos 'días' y 'segundos' del objeto devuelto para encontrar la respuesta, así:
def seconds_difference(stamp1, stamp2):
delta = stamp1 - stamp2
return 24*60*60*delta.days + delta.seconds + delta.microseconds/1000000.
Use abs () en la respuesta si siempre desea un número positivo de segundos.
Para descubrir cuántos segundos en el pasado es una marca de tiempo, puede usarla así:
if seconds_difference(datetime.datetime.now(), timestamp) < 100:
pass
Puede restar dos datetime para encontrar la diferencia entre ellos.
Puede usar datetime.fromtimestamp
para analizar una marca de tiempo POSIX.
Me gusta así:
# self.timestamp should be a datetime object
if (datetime.now() - self.timestamp).seconds > 100:
print "object is over 100 seconds old"