2008-09-24 28 views
60

Me gustaría saber si un objeto python datetime es anterior a X horas o minutos. Estoy tratando de hacer algo similar a:comparaciones de fechas de Python

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 la comparación de fecha y hora en python? Ya miré WorkingWithTime que está cerca pero no es exactamente lo que quiero. Supongo que solo quiero que el objeto datetime se represente en segundos para que pueda hacer una comparación int normal.

Por favor, publique listas de las mejores prácticas de datetime.

+0

'datetime.now()' (u otra hora local dada como un objeto * date date * * naive) puede fallar alrededor de las transiciones DST o cambios en el desplazamiento UTC para la zona horaria local por otras razones. Se debe usar la hora UTC o un objeto datetime con información en su lugar, por ejemplo, 'datetime.utcnow()' o 'datetime.now (timezone.utc) .astimezone()'. – jfs

Respuesta

108

Uso del datetime.timedelta clase:

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

Puede restar dos objetos datetime para encontrar la diferencia entre ellos.
Puede usar datetime.fromtimestamp para analizar una marca de tiempo POSIX.

1

Se puede utilizar una combinación de los 'días' y los atributos del objeto devuelto 'segundos' para averiguar la respuesta, así:

def seconds_difference(stamp1, stamp2): 
    delta = stamp1 - stamp2 
    return 24*60*60*delta.days + delta.seconds + delta.microseconds/1000000. 

Uso abs() en la respuesta si siempre desea una cantidad positiva de segundos.

Para detectar cuántos segundos en el pasado una marca de tiempo es, se puede utilizar de esta manera:

if seconds_difference(datetime.datetime.now(), timestamp) < 100: 
    pass 
5

comparar la diferencia a un timedelta que se crea:

if datetime.datetime.now() - timestamp > datetime.timedelta(seconds = 5): 
    print 'older' 
0

así:

# self.timestamp should be a datetime object 
if (datetime.now() - self.timestamp).seconds > 100: 
    print "object is over 100 seconds old" 
+0

No creo que esto funcione. El atributo de segundos para un timedelta http://docs.python.org/lib/datetime-timedelta.html está limitado a 1 día, por lo que si su período de tiempo es superior a 1 día, será inexacto –

+0

todo lo que tendría que hacer. do es compararlo con otro timedelta en lugar del atributo de segundos. –

5

alternativa:

if (datetime.now() - self.timestamp).total_seconds() > 100: 

Suponiendo self.timestamp es una instancia de fecha y hora

+1

Vale la pena mencionar que total_seconds() está disponible desde Python 2.7. – szymond

Cuestiones relacionadas