将strptime转换为“X小时前”

1 投票
3 回答
2689 浏览
提问于 2025-04-15 15:05

我有一个日期,想把它显示成“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”字符串的那个位置期待并忽略这些字面字符(通常那里会有一个时区偏移的说明)。如果这正是你想要的,那么你的格式字符串就是正确的!

4

看起来Django里的timesince功能可以帮到你,不需要你自己去转换。你可以在这里找到timesince的源代码。

撰写回答