37

我想要一种在 Python 中显示过时项目的自然时间的方法。类似于 Twitter 如何显示来自“片刻前”、“几分钟前”、“两小时前”、“三天前”等的消息。

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

请让我(以及未来的几代搜索者)知道是否已经有一个好的工作解决方案。由于这是一项足够普遍的任务,我想一定有什么。

4

6 回答 6

38

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)
于 2011-03-02T06:09:12.097 回答
18

虽然此时对你没有用,但对未来的搜索者可能有用: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 模块还包含根据语言环境格式化日期和时间的函数,这在时间增量很大时可能很有用。

于 2009-01-04T04:52:36.340 回答
11

有人性化包

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

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

  • 整数
  • 文件大小
  • 浮点数(小数)
于 2015-05-05T09:17:37.317 回答
8

或者,您可以轻松地从 Django 中调整timesince.py,它只有 2 个其他依赖项:一个用于翻译(您可能不需要),一个用于时区(可以轻松调整)。

顺便说一句,Django 有一个非常灵活的 BSD 许可证,您可以在当前使用的任何项目中使用它。

于 2009-01-04T03:02:03.693 回答
5

您是否正在寻找类似的东西(在 Python 中打印相对日期)?

于 2009-01-04T02:52:41.513 回答
1

发现obe可以maya这样使用

pip install maya
>>> maya.when("3 week ago").datetime().strftime("%Y-%m-%d")
'2020-04-27'
于 2020-05-18T16:44:15.603 回答