将strptime转换为“X小时前”
我有一个日期,想把它显示成“X小时前”的格式。我可以很高兴地把小时转换成天、周等等,但我不知道怎么做最开始的计算。下面是我把字符串转换成日期格式的代码:
time.strptime(obj.created_at, '%a %b %d %H:%M:%S +0000 %Y')
另外,如果你能搞明白为什么它不接受‘+0000’的%z格式,那就更棒了——我是不是对这个理解完全错了?
3 个回答
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'
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——当然,你需要决定如何显示通常是小数的“多少小时前”,比如是小时和小数点后几位,还是四舍五入到最接近的整数小时,或者其他方式。
在你的strptime
格式中,字面意思的‘+0000’表示你在“createdat”字符串的那个位置期待并忽略这些字面字符(通常那里会有一个时区偏移的说明)。如果这正是你想要的,那么你的格式字符串就是正确的!