2008-09-24 10 views
60

Je voudrais savoir si un objet datetime python particulier est plus ancien que X heures ou minutes. J'essaie de faire quelque chose de similaire à:Comparaisons de dates Python

if (datetime.now() - self.timestamp) > 100 
# Where 100 is either seconds or minutes 

Cela génère une erreur de type.

Quelle est la bonne façon de faire la comparaison des dates en python? J'ai déjà regardé WorkingWithTime qui est proche mais pas exactement ce que je veux. Je suppose que je veux juste l'objet datetime représenté en secondes afin que je puisse faire une comparaison int normale.

Veuillez publier des listes de bonnes pratiques datetime.

+0

'datetime.now()' (ou tout autre heure locale donnée comme objet * naïve * datetime) peut échouer autour des transitions DST ou des changements de décalage UTC pour le fuseau horaire local pour d'autres raisons. L'heure UTC ou un objet datetime conscient doit être utilisé à la place, par exemple, 'datetime.utcnow()' ou 'datetime.now (timezone.utc) .astimezone()'. – jfs

Répondre

108

Utilisez le datetime.timedelta Votre exemple pourrait être écrit comme:

if (datetime.now() - self.timestamp) > timedelta(seconds = 100) 

ou

if (datetime.now() - self.timestamp) > timedelta(minutes = 100) 
0

Vous pouvez soustraire deux objets datetime pour trouver la différence entre eux. Vous pouvez utiliser datetime.fromtimestamp pour analyser un horodatage POSIX.

1

Vous pouvez utiliser une combinaison des attributs « jours » et «secondes de de l'objet retourné à trouver la réponse, comme ceci:

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

Utilisez abs() dans la réponse si vous voulez toujours un nombre positif de secondes.

Pour découvrir combien de secondes dans le passé un horodatage est, vous pouvez l'utiliser comme ceci:

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

Comparez la différence à un timedelta que vous créez:

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

comme ceci:

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

Je ne pense pas que cela fonctionne. L'attribut seconds pour un timedelta http://docs.python.org/lib/datetime-timedelta.html est limité à 1 jour, donc si votre durée est supérieure à 1 jour, il sera inexact –

+0

tout ce que vous auriez à faire est le comparer avec un autre timedelta au lieu de l'attribut seconds. –

5

Alternative:

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

supposant self.timestamp est une instance datetime

+1

Il est à noter que total_seconds() est disponible depuis Python 2.7. – szymond

Questions connexes