2009-10-15 3 views
1

У меня есть дата в strptime, которую я хочу показать как «X часов назад». Я могу счастливо конвертировать часы в дни и недели и т. Д., Но я не знаю, как сделать начальную сумму. Вот как я преобразовываю строку в strptime:преобразование strptime в «X часов назад»

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

p.s. бонусные баллы за выяснение, почему он не займет% z для «+0000» - я совершенно не прав, что это такое?

+0

Это должно быть один из наиболее распространенных вопросов на SO. –

+1

Я был бы признателен за указание на пример, на который он был дан ответ в этом случае – chrism

+0

Я думаю, что было намек на то, что вы могли бы искать (вверху страницы) предыдущие подобные вопросы и видеть их ответы. – pavium

ответ

3

Кажется, что timesince в Django может помочь вам без необходимости конвертировать. Источник для timesince доступен here.

+0

Определено здесь: http://code.djangoproject.com/browser/django/trunk/django/utils/timesince.py –

+0

К сожалению, я использую zope вместо django, я искал что-то подобное в zope, но похоже, не может найти его. – chrism

0

Можете ли вы использовать дату-время вместо этого? (Или конвертировать все, что у вас есть в 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

Я думаю, мне нужно будет прочитать о datetime, для новичков это немного изгиб ума, а не то, что я могу просто взять из примера – chrism

+0

datetime делает даты/времена более управляемыми, я редко нахожу я использую время. – monkut

+0

Код просто вычитает время created_at с момента времени, так что у нас есть delta.seconds ago, а затем смените delta.seconds на часы, разделив на secs/min и min/hour. – foosion

2

Модуль datetime определенно проще в использовании, но, если вы настаиваете, то вы можете сделать это с time модуля вместо. То есть:

>>> 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 

Одна из причин time модуль настолько противный, чтобы использовать то, что он использует два разных способа представления времени - один является 9-кортеж (и это то, что вы получаете от strptime), и один поплавок «секунд с эпохи» (и это то, что вам нужно делать); функция mktime переводит первую в последнюю. Разница в часах, очевидно, составляет 1/3600 разницы в секундах - вам нужно будет решить, как отображать типично дробное «количество часов назад», конечно (час и доля с некоторыми цифрами или, округленные до ближайшего целое число часов или что еще).

Литерала «+0000» в вашем формате, для strptime, означает, что вы ожидаете и игнорируете эти буквенные символы в этом месте в строке «createdat» (обычно у вас есть спецификатор смещения часового пояса). Если это действительно то, что вы хотите, то у вас есть правильная строка формата!