2010-12-06 6 views
102

Il doit y avoir un moyen plus simple de le faire. J'ai des objets qui veulent être rafraîchis de temps en temps, donc je veux enregistrer quand ils ont été créés, vérifier par rapport à l'horodatage actuel, et rafraîchir si nécessaire.Comment puis-je vérifier la différence, en secondes, entre deux dates?

datetime.datetime s'est avéré difficile, et je ne veux pas plonger dans la bibliothèque ctime. Y at-il quelque chose de plus facile pour ce genre de chose?

Répondre

298

si vous voulez calculer les différences entre les deux dates connues, utilisez total_seconds comme ceci:

import datetime as dt 

a = dt.datetime(2013,12,30,23,59,59) 
b = dt.datetime(2013,12,31,23,59,59) 

(b-a).total_seconds() 

86400,0

#note that seconds doesn't give you what you want: 
(b-a).seconds 
+41

La «note» est la partie la plus importante que les gens manquent. J'aimerais pouvoir donner un autre vote à ce sujet. – Dexter

+0

Il y a des moments où je remarque que ça donne un résultat apparemment ... incorrect. 59.800 secondes pour une différence de fraction de seconde. Donc, pour des opérations plus petites, telles que la différence de secondes, millisecondes ou microsecondes, on peut utiliser '(ba) .microseconds' et ensuite diviser cela pour obtenir les secondes (1000000) ou millisecondes (1000) –

+0

il apparaît que la valeur est ' (ba) .microseconds' est toujours positif, même quand a et b sont échangés – Nickpick

24
import time 
current = time.time() 

...job... 
end = time.time() 
diff = end - current 

cela fonctionnerait-il pour vous?

+1

+1; nous ne nous soucions pas vraiment de la date de l'une ou l'autre invocation - nous nous soucions du temps écoulé. Il suffit donc d'utiliser un horodatage brut, comme indiqué. –

12
>>> from datetime import datetime 

>>> a = datetime.now() 

# wait a bit 
>>> b = datetime.now() 

>>> d = b - a # yields a timedelta object 
>>> d.seconds 
7 

(7 sera tout de temps vous avez attendu un peu au-dessus)

Je trouve datetime.datetime être assez utile, donc s'il y a un scénario compliqué ou maladroit que vous avez rencontré, s'il vous plaît laissez nous savoir.

EDIT: Merci à @WoLpH pour avoir fait remarquer que l'on ne cherche pas toujours à rafraîchir si fréquemment que les dattes seront proches les unes des autres. En tenant compte des jours dans le delta, vous pouvez gérer les écarts plus timestamp:

>>> a = datetime(2010, 12, 5) 
>>> b = datetime(2010, 12, 7) 
>>> d = b - a 
>>> d.seconds 
0 
>>> d.days 
2 
>>> d.seconds + d.days * 86400 
172800 
+1

Si vous renvoyez 'd.seconds + d.days * 86400' à la place, il est correct pendant plusieurs jours;) – Wolph

+5

Notez que, dans le cas général, ceci est * incorrect *. Considérons le cas 'a - b', où' a' est * avant * 'b' (ie, donc le résultat sera négatif):' (a - b) .seconds == 86282' tandis que 'a - b == datetime.timedelta (-1, 86276, 627665) '. La méthode correcte, je crois, est d'utiliser 'timedelta.total_seconds()' ... Mais c'est py2.7 + seulement. –

+2

En effet, la réponse n'est pas correcte et devrait refléter le commentaire @DavidWolever. La bonne réponse est: utilisez 'timedelta.total_seconds()'. Réduit en conséquence en conséquence. – astrojuanlu

8

Nous avons la fonction total_sec onds() avec Python 2.7 S'il vous plaît voir ci-dessous code python 2,6

import datetime 
import time 

def diffdates(d1, d2): 
    #Date format: %Y-%m-%d %H:%M:%S 
    return (time.mktime(time.strptime(d2,"%Y-%m-%d %H:%M:%S")) - 
       time.mktime(time.strptime(d1, "%Y-%m-%d %H:%M:%S"))) 

d1 = datetime.now() 
d2 = datetime.now() + timedelta(days=1) 
diff = diffdates(d1, d2) 
-2
>>> import datetime 

>>> d1 = datetime.datetime.now() 

>>> d2 = datetime.datetime.now() 

>>> d=d2 - d1 

>>> d.seconds 
Questions connexes