Domanda
Vorrei scoprire se un particolare oggetto datetime python è più vecchio di X ore o minuti. Sto cercando di fare qualcosa di simile a:
if (datetime.now() - self.timestamp) > 100
# Where 100 is either seconds or minutes
Questo genera un errore di tipo.
Qual è il modo corretto di fare il confronto di data e ora in Python? Ho già guardato WorkingWithTime che è vicino ma non esattamente quello che voglio. Presumo che voglio solo l'oggetto datetime rappresentato in pochi secondi in modo da poter fare un normale confronto int.
Si prega di pubblicare elenchi delle migliori pratiche di datetime.
Soluzione
Utilizza la classe 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
Il tuo esempio potrebbe essere scritto come:
if (datetime.now() - self.timestamp) > timedelta(seconds = 100)
o
if (datetime.now() - self.timestamp) > timedelta(minutes = 100)
Altri suggerimenti
Confronta la differenza con un timedelta che crei:
if datetime.datetime.now() - timestamp > datetime.timedelta(seconds = 5):
print 'older'
Alternativa:
if (datetime.now() - self.timestamp).total_seconds() > 100:
Supponendo self.timestamp è un'istanza di data / ora
Puoi usare una combinazione degli attributi 'giorni' e 'secondi' dell'oggetto restituito per capire la risposta, in questo modo:
def seconds_difference(stamp1, stamp2):
delta = stamp1 - stamp2
return 24*60*60*delta.days + delta.seconds + delta.microseconds/1000000.
Usa abs () nella risposta se vuoi sempre un numero positivo di secondi.
Per scoprire quanti secondi nel passato è un timestamp, puoi usarlo in questo modo:
if seconds_difference(datetime.datetime.now(), timestamp) < 100:
pass
Puoi sottrarre due datetime per trovare la differenza tra di loro.
Puoi utilizzare datetime.fromtimestamp
per analizzare un timestamp POSIX.
In questo modo:
# self.timestamp should be a datetime object
if (datetime.now() - self.timestamp).seconds > 100:
print "object is over 100 seconds old"