我想要一种在 Python 中显示日期项目的自然时间的方法。类似于 Twitter 将显示“刚才”、“几分钟前”、“两小时前”、“三天前”等消息。

Django 1.0 在 django.contrib 中有一个“人性化”方法。我没有使用 Django 框架,即使我使用了,它也比我想要的更有限。

请让我(以及未来几代搜索者)知道是否已经有一个好的工作解决方案。既然这是一个很常见的任务,我想一定有什么东西。

有帮助吗?

解决方案

虽然此刻对您没有用,但未来的搜索者可能会这样: 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模块还包含根据区域设置格式化日期和时间的函数,这在时间增量很大时可能很有用。

其他提示

特定的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)

人性化包:

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

此外(参见上面的链接)它还支持人性化:

  • 整数
  • 文件大小
  • 浮点数(转为小数)

或者您可以轻松适应 timesince.py 来自Django,它只有2个其他依赖关系:一个用于翻译(你可能不需要)和一个用于时区(可以很容易地适应)。

顺便说一句, Django拥有BSD许可,非常灵活,你将能够在你目前正在使用的任何项目中使用它。

您是否正在寻找类似的内容(打印相关日期在Python)?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top