Python中的自然/相对天数

Python中的自然/相对天数,python,datetime,human-readable,datetime-parsing,humanize,Python,Datetime,Human Readable,Datetime Parsing,Humanize,我想要一种在Python中显示日期项的自然时间的方法。类似于推特显示“片刻前”、“几分钟前”、“两小时前”、“三天前”等消息的方式 Django 1.0在Django.contrib中有一个“人性化”方法。我没有使用Django框架,即使我使用了,它也比我想要的更有限 请让我(以及未来几代的搜索者)知道是否已经有一个好的工作解决方案。既然这是一项很普通的任务,我想一定有什么 您正在寻找(用Python打印相对日期)?或者您可以很容易地适应Django,它本身只有两个依赖项:一个用于翻译(您可能不

我想要一种在Python中显示日期项的自然时间的方法。类似于推特显示“片刻前”、“几分钟前”、“两小时前”、“三天前”等消息的方式

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

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

您正在寻找(用Python打印相对日期)?

或者您可以很容易地适应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'
这张照片是直接从照片上拍摄的。这至少会让你走上一段路。它不会将模糊性降低到“片刻前”之类的级别,但它会将“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)
在Python 2.7中测试 导入日期时间 def prettydate(d): diff=datetime.datetime.utcnow()-d s=差异秒 如果差异天数>7或差异天数<0: 返回d.strftime(“%d%b%y”) elif差异天数==1: 返回“1天前” elif差异天数>1: 返回{}天前。格式(不同天数) elif s有:

您的用例示例:

>>> 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'
此外(参见上面的链接),它还支持人性化:

  • 整数
  • 文件大小
  • 浮点数(到小数)

发现obe可以像这样使用
maya

pip install maya
>>> maya.when("3 week ago").datetime().strftime("%Y-%m-%d")
'2020-04-27'

我发现了这一点:但这似乎是用于解析许多不同形式的日期,而我只是对格式化datetime对象感兴趣。如果python3 babel在发行版存储库中不可用,如何在python3中执行同样的操作?谢谢。你的解决方案是迄今为止最小最优雅的。它只是暗示我们必须翻译所有的字符串。但我就要那个了,谢谢!
pip install maya
>>> maya.when("3 week ago").datetime().strftime("%Y-%m-%d")
'2020-04-27'