Comment vérifier la différence, en secondes, entre deux dates?

180

Il doit y avoir un moyen plus simple de le faire. J'ai des objets qui veulent être actualisés de temps en temps, donc je veux enregistrer quand ils ont été créés, vérifier par rapport à l'horodatage actuel et actualiser si nécessaire.

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

Alex
la source

Réponses:

516

si vous voulez calculer les différences entre deux dates connues, utilisez total_secondscomme 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

0

Rich Signell
la source
95
La «note» est la partie la plus importante qui manque aux gens. J'aurais aimé pouvoir renoncer à un autre vote.
Dexter
Il y a des moments où je remarque que cela donne un résultat apparemment ... incorrect. 59,800 secondes pour une fraction de seconde de différence. Ainsi, pour des opérations plus petites, telles que la différence de secondes, de millisecondes ou de microsecondes, on pourrait utiliser (b-a).microsecondspuis diviser cela pour obtenir les secondes (1000000) ou les millisecondes (1000)
Zld Productions
il semble que la valeur soit toujours positive, même lorsque a et b sont échangés
Nickpick
@Nickpick la valeur n'est pas toujours positive. Par exemple, ce qui suit est -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo
Solution impressionnante! Le code propre n'est pas nécessaire pour créer des fonctions.
Paulo zOiO zuLLu Fabrício
36
import time  
current = time.time()

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

Cela marcherait-il pour toi?

matcheek
la source
1
+1; nous ne nous soucions pas vraiment de la date des deux invocations - nous nous soucions du temps écoulé. Utilisez donc simplement un horodatage brut, comme indiqué.
Karl Knechtel
14
>>> 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 le temps que vous avez attendu un peu plus haut)

Je trouve que datetime.datetime est assez utile, donc s'il y a un scénario compliqué ou gênant que vous avez rencontré, veuillez nous en informer.

EDIT: Merci à @WoLpH pour avoir souligné que l'on ne cherche pas forcément à se rafraîchir si souvent que les dates-heures seront rapprochées. En tenant compte des jours dans le delta, vous pouvez gérer des écarts d'horodatage plus longs:

>>> 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
Jarret Hardie
la source
1
Si vous revenez à la d.seconds + d.days * 86400place, c'est correct pour plusieurs jours;)
Wolph
7
Notez que, dans le cas général, ce n'est pas correct . Considérez le cas a - b, où aest avant b (c'est-à-dire, le résultat sera donc négatif): (a - b).seconds == 86282while a - b == datetime.timedelta(-1, 86276, 627665). La bonne méthode, je crois, est d'utiliser timedelta.total_seconds()… Mais c'est py2.7 + seulement.
David Wolever
4
En effet, la réponse n'est pas juste et devrait refléter le commentaire de @DavidWolever. La bonne réponse est: utiliser timedelta.total_seconds(). Évalué en conséquence.
astrojuanlu
3
J'ai voté pour la réponse Python 2.6. total_seconds()est une fonctionnalité 2.7+.
Joe Holloway
@JoeHolloway Je suppose que cela ne fonctionne pas correctement dans Python 2.6 également.
zen11625
12

Nous avons la fonction total_seconds () avec Python 2.7 Veuillez voir le code ci-dessous pour 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)
pygaur
la source
0

Voici celui qui fonctionne pour moi.

from datetime import datetime

date_format = "%H:%M:%S"

# You could also pass datetime.time object in this part and convert it to string.
time_start = str('09:00:00') 
time_end = str('18:00:00')

# Then get the difference here.    
diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

# Get the time in hours i.e. 9.60, 8.5
result = diff.seconds / 3600;

J'espère que cela t'aides!

therealadrain
la source