Python - Date Et Heure de Comparaison en utilisant les horodateurs, timedelta

j'ai passé la dernière heure à creuser autour des docs de Python et de tant de questions; s'il vous plaît pardonnez-moi d'être un autre débutant de Python piégé par le mystère de la différence de temps en Python.

Mon but est de déterminez la différence entre l'heure actuelle et une certaine date/heure, peu importe si vous êtes dans le passé ou dans l'avenir, et retournez un format utilisable tel que seconds.

par exemple, si les entrées sont 14: 00pm et 16: 00PM (maintenant), je voudrais qu'il dise "-7200", représentant l'événement s'est produit il YA deux heures. Si les entrées sont Fri 4: 00PM (maintenant) et Sun 5:00PM la sortie devrait être "176400" secondes, représentant deux jours et 1 heure de Maintenant.

Ici sont les choses que j'ai essayé...

  • ma première version était une fonction qui a pris un timestamp de chaîne et l'a assemblé avec plusieurs variables, puis les a comparées. Il était encombrant avec beaucoup d'erreurs et j'imagine que si je l'avais posté ici je serais responsable d'un programmeurs de vomir.

  • je suis tombé sur cette fonction magique timedelta et exploré les docs et ainsi, mais je ne pense pas qu'il fait ce que je cherche.

  • j'ai eu l'idée de convertir les deux timestamps en secondes depuis epoch et puis soustraire, mais cela devient un problème si la soustraction est dans le mauvais ordre (différents cas si l'événement est dans le futur), et je me sens comme l'ajout d'instructions if pour vérifier le signe de l'secondes serait maladroit et quelque chose à éviter.

Ceci est mon code actuel (doit encore être corrigé pour la comparaison 'bi-directionnelle'), à partir D'une question précédemment résolue ainsi:

now = time.strftime("%a %b %d %H:%M:%S %Y")
then = time.ctime(os.path.getmtime("x.cache"))
tdelta = datetime.strptime(now, '%a %b %d %H:%M:%S %Y') - datetime.strptime(then, '%a %b %d %H:%M:%S %Y')

et j'ai l'impression que je devrais être capable de tirer quelques secondes de ça, comme dans cette question: timedelta de Python: ne puis-je pas simplement obtenir dans n'importe quelle unité de temps que je veux la valeur de la différence entière?

mais je suis perdu sur la façon de connecter ces dot.

Comment puis-je accomplir?

18
demandé sur Community 2012-08-26 20:24:22

3 réponses

vous devriez pouvoir utiliser

tdelta.total_seconds()

pour obtenir la valeur que vous recherchez. C'est parce que tdelta est un timedelta objet, comme l'est toute la différence entre datetime objets.

quelques remarques:

  1. en utilisant strftime suivi de strptime est superflu. Vous devriez être capable d'obtenir la datetime actuelle avec datetime.now.
  2. de même, en utilisant time.ctime suivi de strptime est plus de travail que nécessaire. Vous devriez être en mesure d'obtenir de l'autre datetime objet datetime.fromtimestamp.

ainsi, votre code final pourrait être

now = datetime.now()
then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
tdelta = now - then
seconds = tdelta.total_seconds()
26
répondu murgatroid99 2013-01-10 20:20:04

Qu'est-ce qui ne va pas avec cette méthode?

>>> from datetime import datetime
>>> a = datetime.now()
>>> b = datetime.now() # after a few seconds
>>> delta = a-b
>>> delta.total_seconds()
-6.655989

Notez que total_seconds n'est disponible qu'en python 2.7<, mais selon la documentation est:

Équivalent à (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 calculées avec la vraie division activé.

ce qui donne exactement le même résultat.

8
répondu Yuval Adam 2012-08-26 16:28:36

j'ai eu le même problème il y a quelques mois. Ce que vous recherchez est datetime.timedelta et datetime.datetime.fromtimestamp (). Voici un exemple pour les utiliser pour résoudre votre problème.

import datetime
import time
t1 = time.time()
#do something to kill time or get t2 from somewhere
a = [i for i in range(1000)]
t2 = time.time()
#get the difference as datetime.timedelta object
diff=(datetime.datetime.fromtimestamp(t1) - datetime.datetime.fromtimestamp(t2))
#diff is negative as t2 is in the future compared to t2
print('difference is {0} seconds'.format(abs(diff.total_seconds())))
2
répondu MHardy 2017-07-02 19:46:57