Convertir timedelta en secondes totales

186

J'ai un décalage horaire

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

Maintenant, comment puis-je trouver le nombre total de secondes écoulées? diff.secondsne compte pas les jours. Je pourrais faire:

diff.seconds + diff.days * 24 * 3600

Existe-t-il une méthode intégrée pour cela?

ripper234
la source
8
@RestRisiko - vous avez raison. Pourtant, il est utile d'avoir la question sur Stack Overflow, donc la prochaine fois que moi, ou quelqu'un d'autre, googles pour cela, il a une bonne réponse comme résultat supérieur.
ripper234
Nous pourrons discuter plus tard des définitions alternatives de «bon»; s'il vous plaît lire ma réponse avant de vous enfuir :)
John Machin
Il existe plusieurs problèmes informatiques time1et diffdans votre code. Pour obtenir l'heure utc actuelle sous la forme d'un objet datetime naïf, utilisez à la datetime.utcnow()place. Pour comprendre pourquoi vous devriez utiliser UTC au lieu de l'heure locale pour trouver la différence, voir Rechercher si 24 heures se sont écoulées entre les datetimes - Python . time.monotonic()pourrait être préférable de trouver le temps écoulé entre les événements (au lieu de time.time()ou datetime.utcnow()).
jfs

Réponses:

385

Utilisez timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Andreas Jung
la source
26
Nouveau dans python 2.7
Evgeny
7
Si quelqu'un doit encore être compatible avec 2.6: Voir stackoverflow.com/questions/3318348/ ... pour savoir comment étendre datetime.timedelta avec la nouvelle méthode vous-même.
Uwe Geuder
6
datetime.timedelta.total_seconds (time2-time1) en Python3.6
Russo
8

Vous avez un problème d'une manière ou d'une autre avec votre datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))expression.

(1) Si tout ce dont vous avez besoin est la différence entre deux instants en quelques secondes, le très simple time.time()fait le travail.

(2) Si vous utilisez ces horodatages à d'autres fins, vous devez considérer ce que vous faites, car le résultat a une grande odeur partout:

gmtime()renvoie un tuple d'heure en UTC mais mktime()attend un tuple d'heure en heure locale.

Je suis à Melbourne, en Australie, où la TZ standard est UTC + 10, mais l'heure d'été est toujours en vigueur jusqu'à demain matin, donc c'est UTC + 11. Lorsque j'ai exécuté ce qui suit, il était le 2011-04-02T20: 31 heure locale ici ... UTC était le 2011-04-02T09: 31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

Vous remarquerez que t3, le résultat de votre expression est UTC + 1, qui semble être UTC + (ma différence DST locale) ... pas très significatif. Vous devriez envisager d'utiliser datetime.datetime.utcnow()ce qui ne sautera pas d'une heure lorsque l'heure d'été est activée / désactivée et peut vous donner plus de précision quetime.time()

John Machin
la source
Merci pour la clarification. Pour le but que j'utilise actuellement, une différence de ne serait-ce que quelques heures de temps en temps n'est pas importante, mais je ne manquerai pas de vérifier cela à l'avenir lorsque j'écrirai quelque chose de plus significatif.
ripper234
-7

Vous pouvez utiliser le module mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
gopisubramni
la source