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?
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:
- en utilisant
strftime
suivi destrptime
est superflu. Vous devriez être capable d'obtenir la datetime actuelle avecdatetime.now
. - de même, en utilisant
time.ctime
suivi destrptime
est plus de travail que nécessaire. Vous devriez être en mesure d'obtenir de l'autredatetime
objetdatetime.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()
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.
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())))