我想要一种在 Python 中显示过时项目的自然时间的方法。类似于 Twitter 如何显示来自“片刻前”、“几分钟前”、“两小时前”、“三天前”等的消息。
Django 1.0 在 django.contrib 中有一个“humanize”方法。我没有使用 Django 框架,即使我使用了,它也比我想要的更受限制。
请让我(以及未来的几代搜索者)知道是否已经有一个好的工作解决方案。由于这是一项足够普遍的任务,我想一定有什么。
我想要一种在 Python 中显示过时项目的自然时间的方法。类似于 Twitter 如何显示来自“片刻前”、“几分钟前”、“两小时前”、“三天前”等的消息。
Django 1.0 在 django.contrib 中有一个“humanize”方法。我没有使用 Django 框架,即使我使用了,它也比我想要的更受限制。
请让我(以及未来的几代搜索者)知道是否已经有一个好的工作解决方案。由于这是一项足够普遍的任务,我想一定有什么。
Twitter 的具体日期很有趣,因为它们仅在第一天是相对的。24 小时后,它们只显示月份和日期。一年后,他们开始显示一年的最后两位数字。这是一个示例函数,它的作用更类似于 Twitter 相对日期,尽管它也总是在 24 小时后显示年份。它仅适用于美国语言环境,但您始终可以根据需要更改它。
# 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)
虽然此时对你没有用,但对未来的搜索者可能有用:babel 模块,它处理各种语言环境的东西,有一个功能可以或多或少地做你想做的事。目前它只在他们的主干中,而不是在最新的公开版本(版本 0.9.4)中。一旦功能发布到版本中,您可以执行以下操作:
from datetime import timedelta
from babel.dates import format_timedelta
delta = timedelta(days=6)
format_timedelta(delta, locale='en_US')
u'1 week'
这直接取自关于时间增量格式的 babel 文档。这至少会让你部分获得成功。它不会模糊到“片刻前”之类的水平,但它会正确地复数化“n分钟”等。
值得一提的是,babel 模块还包含根据语言环境格式化日期和时间的函数,这在时间增量很大时可能很有用。
有人性化包:
>>> 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 中调整timesince.py,它只有 2 个其他依赖项:一个用于翻译(您可能不需要),一个用于时区(可以轻松调整)。
顺便说一句,Django 有一个非常灵活的 BSD 许可证,您可以在当前使用的任何项目中使用它。
您是否正在寻找类似的东西(在 Python 中打印相对日期)?
发现obe可以maya
这样使用
pip install maya
>>> maya.when("3 week ago").datetime().strftime("%Y-%m-%d")
'2020-04-27'