2009-10-15 22 views
1

J'ai une date dans strptime que je veux montrer comme 'X heures auparavant'. Je peux heureusement convertir des heures en jours et semaines etc. mais je ne sais pas comment faire la somme initiale. Voici comment je convertir la chaîne en strptime:convertir strptime en 'X heures ago'

time.strptime(obj.created_at, '%a %b %d %H:%M:%S +0000 %Y') 

P.S. points bonus pour déterminer pourquoi il ne prendra pas% z pour '+0000' - ai-je complètement tort de ce que c'est?

+0

Ce doit être l'une des questions les plus fréquentes sur SO. –

+1

J'apprécierais d'être pointé vers un exemple où il a déjà été répondu dans ce cas – chrism

+0

Je pense que l'indice était que vous pourriez chercher (en haut de la page) pour des questions similaires précédentes et voir leurs réponses. – pavium

Répondre

3

Il semble que le timesince dans Django pourrait vous aider sans avoir à convertir. La source pour timesince est disponible here.

+0

Défini ici: http://code.djangoproject.com/browser/django/trunk/django/utils/timesince.py –

+0

Malheureusement j'utilise zope plutôt le django, j'ai cherché quelque chose comme ça dans zope, mais ne peut pas sembler le trouver. – chrism

0

Pouvez-vous utiliser datetime à la place? (Ou convertir tout ce que vous avez en datetime?)

>>> import datetime 
>>> created_at = datetime.datetime(2009,10,15, 13) 
>>> now = datetime.datetime.now() 
>>> delta = now - created_at 
>>> hours_ago = '%d Hours Ago' % (delta.seconds/60/60) 
>>> hours_ago 
'5 Hours Ago' 
+0

Je pense que je vais avoir besoin de lire à propos de datetime, pour une recrue c'est un peu un esprit bender, et pas quelque chose que je peux emprunter à un exemple – chrism

+0

datetime rend les dates/heures beaucoup plus gérable, je trouve rarement moi-même en utilisant le temps. – monkut

+0

Le code est juste en train de soustraire l'heure created_at de l'heure actuelle, de sorte que nous avons delta.secondes, puis en changeant delta.seconds en heures en divisant par secondes/min et min/heure. – foosion

2

Le module datetime est certainement plus facile à utiliser, mais si vous insistez, vous pouvez le faire avec le module de la place time. À savoir:

>>> import time 
>>> fmt = '%a %b %d %H:%M:%S +0000 %Y' 
>>> time.strftime(fmt) 
'Thu Oct 15 07:54:07 +0000 2009' 
>>> createdat = 'Thu Oct 15 02:30:30 +0000 2009' 
>>> createdtim = time.strptime(createdat, fmt) 
>>> hoursago = (time.time() - time.mktime(createdtim))/3600 
>>> print hoursago 
5.42057559947 

Une raison pour laquelle le module time est tellement agaçant à utiliser est qu'il utilise deux méthodes différentes pour représenter le temps - on est un 9-tuple (et c'est ce que vous obtenez de strptime), et celui-ci est un flottement "secondes depuis l'époque" (et c'est ce que vous devez faire les différences); la fonction mktime traduit le premier à ce dernier. La différence en heures est clairement 1/3600 de la différence en secondes - vous devrez décider comment afficher un "nombre d'heures" typiquement-fractionnaires, bien sûr (heure et fraction avec quelques chiffres, ou, arrondir au plus proche nombre entier d'heures, ou quoi d'autre). Le littéral '+0000' dans votre format, pour strptime, signifie que vous attendez et ignorez les caractères littéraux à cet endroit dans votre chaîne "createdat" (normalement vous auriez un spécificateur de décalage de fuseau horaire là). Si c'est vraiment ce que vous voulez, alors vous avez la bonne chaîne de format!