我想用一种方法来显示Python中标有日期的项目的自然时间。类似于Twitter如何显示“片刻前”,“几分钟前”,“两个小时前”,“三天前”等消息。
Django 1.0在django.contrib中具有“人性化”方法。我没有使用Django框架,即使我使用了它,也比我想要的要受限制。
[请让我(以及以后的搜索者)知道是否已经有了一个好的解决方案。由于这是一项足够常见的任务,因此我想一定有一些东西。
from datetime import timedelta
from babel.dates import format_timedelta
delta = timedelta(days=6)
format_timedelta(delta, locale='en_US')
u'1 week'
直接从the babel documentation on time delta formatting中获取。这至少会让您有所作为。它不会将模糊性降低到“片刻之前”的水平,但会正确地复数“ n分钟”等。就其价值而言,babel模块还包含用于根据语言环境格式化日期和时间的函数,当时间增量较大时,这可能会很有用。
# tested in Python 2.7
import datetime
def prettydate(d):
diff = datetime.datetime.utcnow() - d
s = diff.seconds
if diff.days > 7 or diff.days < 0:
return d.strftime('%d %b %y')
elif diff.days == 1:
return '1 day ago'
elif diff.days > 1:
return '{} days ago'.format(diff.days)
elif s <= 1:
return 'just now'
elif s < 60:
return '{} seconds ago'.format(s)
elif s < 120:
return '1 minute ago'
elif s < 3600:
return '{} minutes ago'.format(s/60)
elif s < 7200:
return '1 hour ago'
else:
return '{} hours ago'.format(s/3600)
>>> import humanize
>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'
您的用例示例:
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=36000)) '10 hours ago' >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=360000)) '4 days ago' >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600000)) 'a month ago'
进一步(请参见上面的链接),它还支持以下方面的人性化:
顺便说一下,Django has a BSD license非常灵活,您将可以在当前正在使用的任何项目中使用它。
maya
pip install maya
>>> maya.when("3 week ago").datetime().strftime("%Y-%m-%d")
'2020-04-27'